2009-03-13 10 views
6

Sto leggendo un file riga per riga, in questo modo:con Java

FileReader myFile = new FileReader(File file); 
BufferedReader InputFile = new BufferedReader(myFile); 
// Read the first line 
String currentRecord = InputFile.readLine(); 

while(currentRecord != null) { 
     currentRecord = InputFile.readLine(); 
} 

Ma se vengono caricati altri tipi di file, sarà ancora leggere i loro contenuti. Ad esempio, se il file caricato è un'immagine, produrrà caratteri indesiderati durante la lettura del file. Quindi la mia domanda è: come posso verificare che il file sia di sicuro CSV prima di leggerlo?

Controllare l'estensione del file è una sorta di lame poiché qualcuno può caricare un file che non è CSV ma ha un'estensione .csv. Grazie in anticipo.

risposta

2

Determinare il tipo MIME di un file non è un'operazione semplice, soprattutto se le sezioni ASCII possono essere combinate con quelle binarie.

In realtà, quando si osserva come un sistema di posta java determina il tipo MIME di un'e-mail, ciò comporta la lettura di tutti i byte e l'applicazione di alcune "regole".
Partenza MimeUtility.java

  • Se il tipo principale di questa origine dati è "text" e se tutti i byte nel suo flusso di input sono US-ASCII, allora la codifica è "7 bit".
  • Se più della metà dei byte non sono US-ASCII, la codifica è "base64".
  • Se meno della metà dei byte non è US-ASCII, la codifica è "quoted-stamp".
  • Se il tipo principale di questa origine dati non è "testo", se tutti i byte del flusso di input sono US-ASCII, la codifica è "7bit".
  • Se esiste anche un carattere non US-ASCII, la codifica è "base64". @return "7bit", "quoted-printable" o "base64"

Come citato da mmyers in un commento cancellato, JavaMimeType dovrebbe fare la stessa cosa, ma:

  • esso è morto dal 2006
  • implica la lettura di tutto il contenuto!

:

File file = new File("/home/bibi/monfichieratester"); 
InputStream inputStream = new FileInputStream(file); 
ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream(); 
int readByte; 
while ((readByte = inputStream.read()) != -1) { 
    byteArrayStream.write(readByte); 
} 
String mimetype = ""; 
byte[] bytes = byteArrayStream.toByteArray(); 

MagicMatch m = Magic.getMagicMatch(bytes); 
mimetype = m.getMimeType(); 

Quindi ... dal momento che si sta leggendo il tutto il contenuto del file in ogni caso, si potrebbe approfittare di questo per determinare il tipo sulla base di tali contenuti e le proprie regole.

0

Java Mime Magic può essere utile. Analizzerà i tipi mime da file e inputstream. Non posso garantire per la sua funzionalità, tuttavia.

This link può fornire ulteriori informazioni. Fornisce diversi mezzi per determinare come fare ciò che vuoi (o almeno qualcosa di simile).

Forse sarei tentato di scrivere qualcosa di specifico nel dominio del problema. per esempio. determinare il numero di valori separati da virgola per riga e rifiutare se non rientra in determinati limiti. Quindi dividere le virgole e analizzare ogni voce in base ai requisiti (ad esempio sono double/float/stringhe valide - e se stringhe, quale codifica).Penso che potrebbe essere necessario farlo comunque, dato che qualcuno può caricare un file che inizia come un CSV ma è danneggiato a metà.