JavascriptProva

Visualizzazione post con etichetta stream. Mostra tutti i post
Visualizzazione post con etichetta stream. Mostra tutti i post

domenica 20 marzo 2016

Leggere i bytes da un file

Ed ecco ora il FileInputStream per leggere i bytes di un file in un buffer:
public class MainActivity extends Activity {

 Button button;
 Button button2;
 Button button3;
 Button button4;

 String filePath = Environment.getExternalStorageDirectory()
   .getAbsolutePath() + "/ilmiofiledalnomelungolungo";

 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  button = (Button) findViewById(R.id.button1);
  button2 = (Button) findViewById(R.id.button2);
  button3 = (Button) findViewById(R.id.button3);
  button4 = (Button) findViewById(R.id.button4);

  button.setOnClickListener(new View.OnClickListener() {

   @Override
   public void onClick(View v) {

    try {
     FileOutputStream fos = new FileOutputStream(filePath);
     byte[] nome = { 0x41, 0x4e, 0x54, 0x4f, 0x4e, 0x45, 0x4c,
       0x4c, 0x4f };
     fos.write(nome);
    } catch (Exception e) {
     e.printStackTrace();
    }

   }
  });
  button2.setOnClickListener(new View.OnClickListener() {

   @Override
   public void onClick(View v) {
    try {
     FileInputStream fis=new FileInputStream(filePath);
     byte[] buffer=new byte[50];
     fis.read(buffer);
     for(int i=0;i<50;i++){
      Log.d(i+"",buffer[i]+"");
     }
    } catch (Exception e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }

   }
  });
 }

}
Ecco il risultato in LogCat:
03-19 17:03:03.740: D/0(15493): 65
03-19 17:03:03.740: D/1(15493): 78
03-19 17:03:03.740: D/2(15493): 84
03-19 17:03:03.740: D/3(15493): 79
03-19 17:03:03.740: D/4(15493): 78
03-19 17:03:03.740: D/5(15493): 69
03-19 17:03:03.740: D/6(15493): 76
03-19 17:03:03.740: D/7(15493): 76
03-19 17:03:03.740: D/8(15493): 79
03-19 17:03:03.740: D/9(15493): 0
03-19 17:03:03.740: D/10(15493): 0
03-19 17:03:03.740: D/11(15493): 0
...che sono i codici ASCII di "ANTONELLO" in notazione decimale.
65/16= 4 con resto di 1: 0x41
78/16= 4 con resto di 14 (E): 0x4e
84/16= 5 con resto di 4; 0x54
79/16= 4 con resto di 15 (F): 0x4f
...eccetera...

E' valso la pena, imparare la tabellina del 16, per fare i calcoli un po' più agevolmente! :D

Scrivere un byte e un array di bytes sul file creato nella memoria del cellulare

Inizio a scrivere sui files creati.
Ora metto l'iniziale del mio nome sul file:
   button.setOnClickListener(new View.OnClickListener() {
  
  @Override
  public void onClick(View v) {
   
   try {
    FileOutputStream fos=new FileOutputStream(filePath);
    fos.write(65);
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   
  }
 });
Aprendo in Hex Editor, leggo 41 che viene tradotto in A come da tabella ASCII.
Perfetto!
Ora voglio scrivere un array di bytes... Scrivo il mio nome usando direttamente i numeri in formato esadecimale perché ricordo meglio i codici ASCII.
   button.setOnClickListener(new View.OnClickListener() {
  
  @Override
  public void onClick(View v) {
   
   try {
    FileOutputStream fos=new FileOutputStream(filePath);
    byte[] nome= {0x41,0x4e,0x54,0x4f,0x4e,0x45,0x4c,0x4c,0x4f};
    fos.write(nome);
   } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   
  }
 });
Riuscito perfettamente: aggiungo l'estensione .txt al nome del file e lo apro con Blocco Note:
ANTONELLO

Procediamo per gradi: creazione di un file nella memoria del cellulare.

Qui dobbiamo andarci molto per gradi...

Sto affastellando molti concetti e alla fine mi ci perdo.
Con la mia proverbiale capacità di isolare i problemi e affrontarli uno per uno, devo prendere maggiore confidenza con gli STREAM!

Per prima cosa, creiamo un file vuoto nel cellulare, nella cartella storage/sdcard.
public class MainActivity extends Activity{
  
  Button button;
  Button button2;
  Button button3;
  Button button4;

  String filePath=
    Environment.getExternalStorageDirectory().getAbsolutePath()+
    "/ilmiofiledalnomelungolungo";
  
 
  
protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
   
   button=(Button)findViewById(R.id.button1);
   button2=(Button)findViewById(R.id.button2);
   button3=(Button)findViewById(R.id.button3);
   button4=(Button)findViewById(R.id.button4);
   
   button.setOnClickListener(new View.OnClickListener() {
  
  @Override
  public void onClick(View v) {
   try {
    FileOutputStream fos=new FileOutputStream(filePath);
   } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   
  }
 });
}
Con la pressione sul primo dei quattro bottoni presenti sull'activity viene creato il file dal nome assurdo che gli ho dato per rendermelo facilmente riconoscibile.



Il file è di lunghezza zero, ovviamente.
Lo apro anche con l'Hex Editor... E' zero!

giovedì 10 ottobre 2013

Metodi di lettura di uno stream.

Non capisco.
Dunque, riepiloghiamo: uno stream può essere letto con metodi diversi:
  • Read, che ha bisogno di un buffer;
  • ReadByte, che legge un byte alla volta;
  • Per mezzo di un Reader, che è un oggetto a parte.
Sparo di aver capito... La cosa mi è un po' ostica!

Lettura in un buffer di un file wav mediante il metodo Read

Ecco, con questo codice leggo una parte di un file WAV. E ottengo la conferma che si tratta di un file WAV in quanto ne riconosco l'header:
Imports System.IO
Module Module1
    Dim corrente As New FileStream("c:\users\antonello\desktop\voce.wav", FileMode.Open)

    Dim destinazione(&H100) As Byte
    Sub Main()
        
        corrente.Read(destinazione, 0, destinazione.Length)

        For n = 0 To destinazione.Length - 1
            Console.Write(Chr(destinazione(n)))
        Next

        Console.ReadKey()
    End Sub

End Module
RIFFD☻☺ WAVEfmt ►   ☺ ☺ ◄+  ◄+  ☺ data ☻☺ ????⌂???????????????????⌂??????????⌂⌂⌂
????⌂???????????????????⌂??⌂???????⌂???⌂?⌂?????⌂??????⌂????????⌂⌂???????????⌂???
????????????⌂????⌂⌂???⌂?⌂???⌂??????????????????????????????????⌂???????????⌂???⌂
⌂????⌂??????⌂⌂?


Lettura di un file wav in un buffer mediante il metodo .Read

Ecco, con questo codice leggo una parte di un file WAV. E ottengo la conferma che si tratta di un file WAV in quanto ne riconosco l'header:
Imports System.IO
Module Module1
    Dim corrente As New FileStream("c:\users\antonello\desktop\voce.wav", FileMode.Open)

    Dim destinazione(&H100) As Byte
    Sub Main()
        
        corrente.Read(destinazione, 0, destinazione.Length)

        For n = 0 To destinazione.Length - 1
            Console.Write(Chr(destinazione(n)))
        Next

        Console.ReadKey()
    End Sub

End Module
RIFFD☻☺ WAVEfmt ►   ☺ ☺ ◄+  ◄+  ☺ data ☻☺ ????⌂???????????????????⌂??????????⌂⌂⌂
????⌂???????????????????⌂??⌂???????⌂???⌂?⌂?????⌂??????⌂????????⌂⌂???????????⌂???
????????????⌂????⌂⌂???⌂?⌂???⌂??????????????????????????????????⌂???????????⌂???⌂
⌂????⌂??????⌂⌂?


martedì 8 ottobre 2013

Lettura e scrittura di bytes su uno stream

Ho creato un oggetto MemoryStream.
Imports System.IO
Public Class Form1
    Dim memoria As Stream
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        memoria = New MemoryStream


    End Sub
End Class
Ora devo vedere come si scrive e si legge da questo stream...

        memoria = New MemoryStream
        memoria.WriteByte(12)
Come si legge dallo stream?

        memoria = New MemoryStream
        memoria.WriteByte(12)

        Dim risultato As Integer
        memoria.Position = 0
        risultato = memoria.ReadByte()
        MsgBox(risultato)
E ottengo 12.

Scrivo due bytes.
        memoria = New MemoryStream
        memoria.WriteByte(12)
        memoria.WriteByte(4)
Leggo il byte in posizione 1.
                memoria = New MemoryStream
        memoria.WriteByte(12)
        memoria.WriteByte(4)

        Dim risultato As Integer
        memoria.Position = 1
        risultato = memoria.ReadByte()
        MsgBox(risultato)
E ottengo 4.

E finora ho capito come "funziona"!