Omet navegació

5.2.2 CS-IntelliJ: Accés a les dades

Farem accés als fitxers de Cloud Storage per a llegir-los, per a baixar-los. Mencionarem el fet de guardar fitxers, però no l'utilitzarem tant.

Ho farem per mig del mètode get() del bucket, al qual li passarem el nom del fitxer que volem llegir, i ens tornarà un blob (de cloud storage) amb el seu contingut.

val blob = bucket?.get(nomIm.getText())

Aquest blob podrem agafar-lo de dues maneres:

  • Baixant-lo a un fitxer temporal amb el mètode downloadTo()
  • Agafant-lo directament en memòria a un ByteBuffer de grandària suficient
  • Agafant-lo directament en memòria a un ByteArray amb el mètode getContent() i aleshores no cal especificar cap grandària (potser siga el més còmode)

De la primera manera ho faríem així, baixem el fitxer a un fitxer auxiliar, i des d'alli el carreguem

        // Primera manera de llegir, amb un fitxer auxiliar
        val f = File("auxiliar")
        blob?.downloadTo(FileOutputStream(f))
        val image = ImageIO.read(f)
        foto.setIcon(ImageIcon(image))

De la segona manera ens muntem un reader (de Cloud Storage) per poder carregar-ho en memòria a un ByteBuffer

		//Segona manera de llegir: muntant un reader per a carregar a un ByteBuffer
		val im = ByteBuffer.allocate(1024 * 1024)
		blob?.reader()?.read(im)
		val image = ImageIO.read(ByteArrayInputStream(im.array()))
		foto.setIcon(ImageIcon(image))

La tercera manera, segurament és la més còmoda, amb el mètode getContent(), que ens torna el ByteArray. P

        //Tercera manera de llegir: amb getContent per a carregar a un ByteArray
        val im = blob?.getContent()
        val image = ImageIO.read(im?.inputStream())
        foto.setIcon(ImageIcon(image))

Qualsevol de les tres maneres ens hauria de funcionar bé, col·locant juntament amb la definició del blob en la funció que s'executa en apretar el botó, agafar(). I aquest seria el resultat:

Altres mètodes del bucket que ens poden interessar són:

  • get(): agafa un fitxer, passant-li el nom i tornant un blob. És el que hem utiitzat.
  • create(): serveix per a pujar un fitxer al bucket; se li passen 3 paràmetres, el nom que tindrà el fitxer en el Clousd Storage, el contingut que se li pot passar en forma de ByteArray o de InputStream, i el tipus de fitxer (per exemple "image/png")
  • list(): torna un conjunt de blobs en forma de Page<Blob>. De cada element blob podrem baixar-nos el contingut a un fitxer auxiliar, a un ByteBuffer, agafar el seu nom, ...