2015-03-07 1 views
0

J'essaye de télécharger un HashMap vers GCS. La première chose que je fais est de sauver ma HashMap mémoire interne:Stockage d'un objet HashMap dans Google Cloud Storage (GCS)

HashMap<Integer, Integer> picViews = new HashMap<Integer, Integer>(); 
//Write the local file with total picture views 
private void writeViewFile(String filename) { 

    try { 
     FileOutputStream f = openFileOutput(filename, Context.MODE_PRIVATE); 
     ObjectOutputStream s = new ObjectOutputStream(f); 
     s.writeObject(picViews); 
     s.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

En utilisant le code suivant, je suis en train de créer un objet am nommé « myViewsTest » dans mon seau « isthiscute-classement »:

public void uploadViews() throws Exception { 
    // Authorization. 
    if (googleCredential == null) { 
     googleCredential = authorize(); 
    } 

    // Set up global Storage instance. 
    client = new Storage.Builder(httpTransport, JSON_FACTORY, googleCredential).setApplicationName(APPLICATION_NAME).build(); 
    String fileName = "myViews"; 

    StorageObject object = new StorageObject(); 
    object.setBucket(BUCKET_NAME_RANKINGS); 

    //Read stored HashMap as an ObjectInputStream 
    FileInputStream fis = openFileInput(fileName); 
    ObjectInputStream ois = new ObjectInputStream(fis); 
    HashMap<Integer, Integer> testHash; 
    try { 
     //This correctly reads the HashMap from file 
     testHash = (HashMap<Integer, Integer>) ois.readObject(); 

     String contentType = URLConnection.guessContentTypeFromStream(ois); 
     InputStreamContent content = new InputStreamContent(contentType, ois); 

     //This does not add a HashMap object to my Storage Object 
     Storage.Objects.Insert insert = client.objects().insert(BUCKET_NAME_RANKINGS, object, content); 
     insert.setName("myViewsTest"); 

     //This does add a HashMap to my Storage Object --> Fails to upload 
     insert.set("object", testHash); 

     insert.execute(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     fis.close(); 
     ois.close(); 
    } 

} 

Enfin, j'essaie de télécharger l'objet. C'est ce que je tente:

public void downloadViews() throws Exception { 
    // Authorization. 
    if (googleCredential == null) { 
     googleCredential = authorize(); 
    } 

    // Set up global Storage instance. 
    client = new Storage.Builder(httpTransport, JSON_FACTORY, googleCredential).setApplicationName(APPLICATION_NAME).build(); 
    String fileName = "myViewsTest"; 

    String destinationDirectory = this.getCacheDir().toString(); 
    File file = new File(destinationDirectory + "/" + fileName); 

    Storage.Objects.Get get = client.objects().get(BUCKET_NAME_RANKINGS, fileName); 
    FileOutputStream fos = new FileOutputStream(file); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    HashMap<Integer, Integer> testHash = null; 
    try { 
     get.executeAndDownloadTo(oos); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     fos.close(); 
     oos.close(); 
    } 

} 

Je ne suis pas sûr quant à la façon d'entrer les données brutes du ObjectOutputStream retour à mon HashMap original « testHash ». D'après ce que je peux voir dans mon panier GCS, je ne crois pas que les données correctes soient même sauvegardées dans mon seau. Il est 0 octets et quand je télécharge l'objet et l'affichage dans Notepad ++ il n'est pas lisible.

Toute aide serait grandement appréciée !!

Jenny

MISE À JOUR: La suggestion de Brandon Yarbrough me permet de lire le fichier interne que j'ai créé pour mon HashMap ("myViews"). Mon nouveau problème se produit lorsque vous essayez de télécharger l'objet HashMap dans mon compartiment GCS. De ce que je peux dire l'InputStream contenant mon HashMap ("ois") n'est pas attaché à mon objet de stockage.

Répondre

1

Vous utilisez ObjectOutputStream pour transformer un objet Java sérialisable, un HashMap dans ce cas, en données en continu. Reconstituer ce flux de données dans un objet est appelé "désérialisation". Dans ce cas, le flux correspondant est un ObjectInputStream. Vous pouvez l'utiliser comme ceci:

FileInputStream fis = new FileInputStream(fileName); 
    ObjectInputStream ois = new ObjectInputStream(fis); 

    HashMap<Integer, Integer> testHash; 
    testHash = (HashMap<Integer, Integer>) ois.readObject(); 

    ois.close(); 

Pour cet exemple, j'ai laissé un fichier dans le cadre de l'opération, mais gardez à l'esprit qu'il n'y a pas besoin de le faire. Vous pouvez presque aussi facilement diffuser votre téléchargement directement dans l'ObjectInputStream.

Vous pouvez également consulter la documentation au ObjectInputStreams.