2015-08-25 6 views
7
public static void main(String[] args) throws IOException 
{ 
    Scanner in = new Scanner(System.in); 
    String fileName = in.nextLine(); 

    Writer out = new BufferedWriter(new OutputStreamWriter(
      new FileOutputStream("C:/temp/"+fileName+".txt"), "UTF-8"));//Ex thrown 
    out.close(); 
} 

Ich versuche, einen Schreiber zu erstellen, der chinesische Zeichen mit dem Dateinamen verarbeiten kann. So kann ich zum Beispiel eine Datei namens 你好.txt erstellen.Kann keine chinesischen Zeichen in einen Dateinamen schreiben

Allerdings bekomme ich eine FileNotFoundException mit dem obigen Code, es funktioniert perfekt für englische Zeichen, aber nicht mit chinesischen Schriftzeichen.

Ich folgte den Antworten hier: How to write a UTF-8 file with Java?, um den obigen Code zu erzeugen, aber es funktioniert nicht.

Wer weiß, wie kann ich das erreichen?

Stack Trace:

Exception in thread "main" java.io.FileNotFoundException: C:\temp\??.txt (The filename, directory name, or volume label syntax is incorrect) 
    at java.io.FileOutputStream.open0(Native Method) 
    at java.io.FileOutputStream.open(Unknown Source) 
    at java.io.FileOutputStream.<init>(Unknown Source) 
    at java.io.FileOutputStream.<init>(Unknown Source) 

Mit NIO:

Path path = Paths.get("C:/temp/"+fileName+".txt");//throws ex 
Charset charset = Charset.forName("UTF-8"); 
Path file = Files.createFile(path); 
BufferedWriter bufferedWriter = Files.newBufferedWriter(file, charset); 
bufferedWriter.close(); 

Stack:

Exception in thread "main" java.nio.file.InvalidPathException: Illegal char <?> at index 8: C:/temp/?.txt 
    at sun.nio.fs.WindowsPathParser.normalize(Unknown Source) 
    at sun.nio.fs.WindowsPathParser.parse(Unknown Source) 
    at sun.nio.fs.WindowsPathParser.parse(Unknown Source) 
    at sun.nio.fs.WindowsPath.parse(Unknown Source) 
    at sun.nio.fs.WindowsFileSystem.getPath(Unknown Source) 
    at java.nio.file.Paths.get(Unknown Source) 
+1

Ich glaube, das ist OS-abhängig. OS kontrolliert, welche Zeichenfolgen als Dateinamen zulässig sind. Welches Betriebssystem verwenden Sie? P.S. Betriebssysteme kümmern sich nicht besonders, welche Bytes in den Daten der Datei enthalten sind; Das hängt von den Apps ab, die die Dateien lesen. Deshalb hilft Ihnen der Link, dem Sie folgen wollten, nicht. – ajb

+0

Können Sie bitte StackTrace bereitstellen? –

+0

@TAsk Stack-Trace hinzugefügt und in sscce angezeigt, welche Zeile wirft es – Aequitas

Antwort

5

Ich habe herausgefunden, dass dieses Problem auf die Zeichenkodierung der Eclipse-Konsole verbunden ist und nicht verwandt mit der Java.

Ich habe den gleichen Code und verwenden Run Configuration anders verwendet, wie unten gezeigt,

enter image description here

Jetzt, nach dem Ausführen des Programms habe ich in meiner Konsole folgende Ausgabe,

Exception in thread "main" java.io.FileNotFoundException: C:\temp\??.txt (The filename, directory name, or volume label syntax is incorrect) 
    at java.io.FileOutputStream.open(Native Method) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:206) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:95) 
    at Test.main(Test.java:21) 

Fazit: Hier für ISO-8859-1 Codierung in Laufkonfiguration Scanner wird nicht in der Lage sein, diese Zeichen korrekt von der Konsole zu lesen, da die Konsole eine andere Zeichencodierung hat und Sie ?? als filename haben.

Bitte ändern Sie die Zeichencodierung für Ihre Konsole, ich glaube fest, dass Sie einige IDE verwenden. Möglicherweise haben Sie sich geändert oder Ihre Konsole hat die Zeichencodierung übernommen, die diese Zeichen nicht kodieren soll.

+0

ich ISO8859 geändert und es funktioniert immer noch nicht – Aequitas

+1

Oh ich das falsch verstanden, was Sie meinten, ist Cp1252, was ich hatte ursprünglich und es auf UTF-8-Fixes es – Aequitas

+1

@TAsk Sehr schönen Fang YEP ändern! – chrylis

Verwandte Themen