我如何创build一个文件并在Java中写入?
用Java创build和写入(文本)文件最简单的方法是什么?
请注意,下面的每个代码示例都会抛出IOExcepions
。 Try / catch / finally块为简洁起见已被省略。 有关exception处理的信息,请参阅本教程 。
创build一个文本文件(注意,如果文件已经存在,将会覆盖该文件):
PrintWriter writer = new PrintWriter("the-file-name.txt", "UTF-8"); writer.println("The first line"); writer.println("The second line"); writer.close();
创build一个二进制文件(也将覆盖文件):
byte data[] = ... FileOutputStream out = new FileOutputStream("the-file-name"); out.write(data); out.close();
Java 7+用户可以使用Files
类来写入文件:
创build一个文本文件:
List<String> lines = Arrays.asList("The first line", "The second line"); Path file = Paths.get("the-file-name.txt"); Files.write(file, lines, Charset.forName("UTF-8")); //Files.write(file, lines, Charset.forName("UTF-8"), StandardOpenOption.APPEND);
创build一个二进制文件:
byte data[] = ... Path file = Paths.get("the-file-name"); Files.write(file, data); //Files.write(file, data, StandardOpenOption.APPEND);
在Java 7及更高版本中:
try (Writer writer = new BufferedWriter(new OutputStreamWriter( new FileOutputStream("filename.txt"), "utf-8"))) { writer.write("something"); }
虽然有一些有用的工具:
- FileUtils.writeStringtoFile(..)来自commons-io
- Files.write(..)来自番石榴
还要注意,你可以使用FileWriter
,但它使用默认编码,这通常是一个坏主意 – 最好是明确指定编码。
下面是java-7之前的原始答案
Writer writer = null; try { writer = new BufferedWriter(new OutputStreamWriter( new FileOutputStream("filename.txt"), "utf-8")); writer.write("Something"); } catch (IOException ex) { // report } finally { try {writer.close();} catch (Exception ex) {/*ignore*/} }
另请参阅: 读取,写入和创build文件 (包括NIO2)。
如果您已经拥有要写入文件的内容(并且不是随时生成的),Java 7中的java.nio.file.Files
作为本机I / O的一部分提供了实现最简单和最有效的方式你的目标。
基本上创build和写入文件只有一行,而且一个简单的方法调用 !
以下示例创build并写入6个不同的文件以展示如何使用它:
Charset utf8 = StandardCharsets.UTF_8; List<String> lines = Arrays.asList("1st line", "2nd line"); byte[] data = {1, 2, 3, 4, 5}; try { Files.write(Paths.get("file1.bin"), data); Files.write(Paths.get("file2.bin"), data, StandardOpenOption.CREATE, StandardOpenOption.APPEND); Files.write(Paths.get("file3.txt"), "content".getBytes()); Files.write(Paths.get("file4.txt"), "content".getBytes(utf8)); Files.write(Paths.get("file5.txt"), lines, utf8); Files.write(Paths.get("file6.txt"), lines, utf8, StandardOpenOption.CREATE, StandardOpenOption.APPEND); } catch (IOException e) { e.printStackTrace(); }
public class Program { public static void main(String[] args) { String text = "Hello world"; BufferedWriter output = null; try { File file = new File("example.txt"); output = new BufferedWriter(new FileWriter(file)); output.write(text); } catch ( IOException e ) { e.printStackTrace(); } finally { if ( output != null ) { output.close(); } } } }
这里有一个小程序来创build或覆盖文件。 这是长版,所以可以更容易地理解。
import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; public class writer { public void writing() { try { //Whatever the file path is. File statText = new File("E:/Java/Reference/binhttp://img.dovov.comstatsTest.txt"); FileOutputStream is = new FileOutputStream(statText); OutputStreamWriter osw = new OutputStreamWriter(is); Writer w = new BufferedWriter(osw); w.write("POTATO!!!"); w.close(); } catch (IOException e) { System.err.println("Problem writing to the file statsTest.txt"); } } public static void main(String[]args) { writer write = new writer(); write.writing(); } }
使用:
try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("myFile.txt"), StandardCharsets.UTF_8))) { writer.write("text to write"); } catch (IOException ex) { // Handle me }
使用try()
会自动closuresstream。 这个版本很短,速度快(缓冲),并且可以select编码。
这个特性是在Java 7中引入的。
用Java创build和写入文件的一种非常简单的方法:
import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; public class CreateFiles { public static void main(String[] args) { try{ // Create new file String content = "This is the content to write into create file"; String path="D:\\a\\hi.txt"; File file = new File(path); // If file doesn't exists, then create it if (!file.exists()) { file.createNewFile(); } FileWriter fw = new FileWriter(file.getAbsoluteFile()); BufferedWriter bw = new BufferedWriter(fw); // Write in file bw.write(content); // Close connection bw.close(); } catch(Exception e){ System.out.println(e); } } }
参考: 在java中创build文件的例子
在这里我们input一个string到一个文本文件中:
String content = "This is the content to write into a file"; File file = new File("filename.txt"); FileWriter fw = new FileWriter(file.getAbsoluteFile()); BufferedWriter bw = new BufferedWriter(fw); bw.write(content); bw.close(); // Be sure to close BufferedWriter
我们可以轻松地创build一个新文件并添加内容。
如果你想有一个相对无痛苦的经历,你也可以看看Apache Commons IO包 ,更具体的是FileUtils
类 。
永远不要忘记检查第三方库。 用于date操作的Joda-Time ,用于常见string操作的Apache Commons Lang StringUtils
等可以使您的代码更具可读性。
Java是一门伟大的语言,但是标准库有时候有点低级。 尽pipe如此,仍然强大但低层次。
由于作者没有具体说明他们是否需要Java版本的解决scheme(Sun和IBM都是这样,而这些技术上是最普遍的JVM),并且由于大多数人似乎已经回答了作者的问题之前,它是指定它是一个文本(非二进制)的文件,我决定提供我的答案。
首先,Java 6已经普遍达到了使用寿命,而且由于作者没有指定他需要兼容性,所以我猜测它自动意味着J7或更高版本(J7还没有被IBM列入清单)。 所以,我们可以看看文件I / O教程: https : //docs.oracle.com/javase/tutorial/essential/io/legacy.html
在Java SE 7发行版之前,java.io.File类是用于文件I / O的机制,但它有几个缺点。
- 许多方法失败时不会抛出exception,所以不可能获得有用的错误信息。 例如,如果文件删除失败,程序将收到“删除失败”,但不知道是否是因为该文件不存在,用户没有权限,或者还有其他一些问题。
- 重命名方法在平台上不一致。
- 对符号链接没有真正的支持。
- 需要更多的元数据支持,例如文件权限,文件所有者和其他安全属性。 访问文件元数据效率不高。
- 许多File方法没有扩展。 通过服务器请求大型目录列表可能会导致挂起。 大目录也可能导致内存资源问题,导致拒绝服务。
- 如果存在循环的符号链接,那么编写可recursion地遍历文件树并作出适当响应的可靠代码是不可能的。
哦,那就排除了java.io.File。 如果一个文件不能写/附加,你甚至可能不知道为什么。
我们可以继续查看教程: https : //docs.oracle.com/javase/tutorial/essential/io/file.html#common
如果您有所有的行,您将提前写入(附加)到文本文件 ,推荐的方法是https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#写java.nio.file.Path-java.lang.Iterable-java.nio.charset.Charset中,java.nio.file.OpenOption …-
这是一个例子(简化):
Path file = ...; List<String> linesInMemory = ...; Files.write(file, linesInMemory, StandardCharsets.UTF_8);
另一个例子(追加):
Path file = ...; List<String> linesInMemory = ...; Files.write(file, linesInMemory, Charset.forName("desired charset"), StandardOpenOption.CREATE, StandardOpenOption.APPEND, StandardOpenOption.WRITE);
如果您想要随时编写文件内容,请执行以下操作 : https : //docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#newBufferedWriter-java.nio.file.Path-java .nio.charset.Charset-java.nio.file.OpenOption …-
简单的例子(J8或以上):
Path file = ...; try (BufferedWriter writer = Files.newBufferedWriter(file)) { writer.append("Zero header: ").append('0').write("\r\n"); [...] }
另一个例子(追加):
Path file = ...; try (BufferedWriter writer = Files.newBufferedWriter(file, Charset.forName("desired charset"), StandardOpenOption.CREATE, StandardOpenOption.APPEND, StandardOpenOption.WRITE)) { writer.write("----------"); [...] }
这些方法在作者的部分上只需要很less的努力,并且在写入[文本]文件时应该被所有其他人所偏好。
使用:
JFileChooser c = new JFileChooser(); c.showOpenDialog(c); File writeFile = c.getSelectedFile(); String content = "Input the data here to be written to your file"; try { FileWriter fw = new FileWriter(writeFile); BufferedWriter bw = new BufferedWriter(fw); bw.append(content); bw.append("hiiiii"); bw.close(); fw.close(); } catch (Exception exc) { System.out.println(exc); }
我认为这是最短的方法:
FileWriter fr = new FileWriter("your_file_name.txt"); // After '.' write // your file extention (".txt" in this case) fr.write("Things you want to write into the file"); // Warning: this will REPLACE your old file content! fr.close();
如果你由于某种原因想要分离创build和写作的行为,那么Java的等效性就是
try { //create a file named "testfile.txt" in the current working directory File myFile = new File("testfile.txt"); if ( myFile.createNewFile() ) { System.out.println("Success!"); } else { System.out.println("Failure!"); } } catch ( IOException ioe ) { ioe.printStackTrace(); }
createNewFile()
做一个存在检查和文件创buildprimefaces。 例如,如果您希望在写入文件之前确保自己是该文件的创build者,那么这会非常有用。
import java.io.File; import java.io.FileWriter; import java.io.IOException; public class FileWriterExample { public static void main(String [] args) { FileWriter fw= null; File file =null; try { file=new File("WriteFile.txt"); if(!file.exists()) { file.createNewFile(); } fw = new FileWriter(file); fw.write("This is an string written to a file"); fw.flush(); fw.close(); System.out.println("File written Succesfully"); } catch (IOException e) { e.printStackTrace(); } } }
package fileoperations; import java.io.File; import java.io.IOException; public class SimpleFile { public static void main(String[] args) throws IOException { File file =new File("text.txt"); file.createNewFile(); System.out.println("File is created"); FileWriter writer = new FileWriter(file); // Writes the content to the file writer.write("Enter the text that you want to write"); writer.flush(); writer.close(); System.out.println("Data is entered into file"); } }
要创build文件而不覆盖现有文件:
System.out.println("Choose folder to create file"); JFileChooser c = new JFileChooser(); c.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); c.showOpenDialog(c); c.getSelectedFile(); f = c.getSelectedFile(); // File f - global variable String newfile = f + "\\hi.doc";//.txt or .doc or .html File file = new File(newfile); try { //System.out.println(f); boolean flag = file.createNewFile(); if(flag == true) { JOptionPane.showMessageDialog(rootPane, "File created successfully"); } else { JOptionPane.showMessageDialog(rootPane, "File already exists"); } /* Or use exists() function as follows: if(file.exists() == true) { JOptionPane.showMessageDialog(rootPane, "File already exists"); } else { JOptionPane.showMessageDialog(rootPane, "File created successfully"); } */ } catch(Exception e) { // Any exception handling method of your choice }
最简单的方法我可以find:
Path sampleOutputPath = Paths.get("/tmp/testfile") try (BufferedWriter writer = Files.newBufferedWriter(sampleOutputPath)) { writer.write("Hello, world!"); }
它可能只适用于1.7+。
只有一条线! path
和line
是string
import java.nio.file.Files; import java.nio.file.Paths; Files.write(Paths.get(path), lines.getBytes());
如果我们使用Java 7及以上版本,并且知道要添加(附加)到文件的内容,我们可以使用NIO包中的newBufferedWriter方法。
public static void main(String[] args) { Path FILE_PATH = Paths.get("C:/temp", "temp.txt"); String text = "\n Welcome to Java 8"; //Writing to the file temp.txt try (BufferedWriter writer = Files.newBufferedWriter(FILE_PATH, StandardCharsets.UTF_8, StandardOpenOption.APPEND)) { writer.write(text); } catch (IOException e) { e.printStackTrace(); } }
有几点需要注意:
- 指定字符集编码总是一个很好的习惯,并且我们在类
StandardCharsets
有常量。 - 代码使用
try-with-resource
语句,其中资源在try之后自动closures。
虽然OP没有问,但是如果我们想要search具有特定关键字的行,例如confidential
我们可以利用Java中的streamAPI:
//Reading from the file the first line which contains word "confidential" try { Stream<String> lines = Files.lines(FILE_PATH); Optional<String> containsJava = lines.filter(l->l.contains("confidential")).findFirst(); if(containsJava.isPresent()){ System.out.println(containsJava.get()); } } catch (IOException e) { e.printStackTrace(); }
使用input和输出stream进行文件读取和写入:
//Coded By Anurag Goel //Reading And Writing Files import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class WriteAFile { public static void main(String args[]) { try { byte array [] = {'1','a','2','b','5'}; OutputStream os = new FileOutputStream("test.txt"); for(int x=0; x < array.length ; x++) { os.write( array[x] ); // Writes the bytes } os.close(); InputStream is = new FileInputStream("test.txt"); int size = is.available(); for(int i=0; i< size; i++) { System.out.print((char)is.read() + " "); } is.close(); } catch(IOException e) { System.out.print("Exception"); } } }
只包括这个包:
java.nio.file
然后你可以使用这段代码来写这个文件:
Path file = ...; byte[] buf = ...; Files.write(file, buf);
有一些简单的方法,如:
File file = new File("filename.txt"); PrintWriter pw = new PrintWriter(file); pw.write("The world I'm coming"); pw.close(); String write = "Hello World!"; FileWriter fw = new FileWriter(file); BufferedWriter bw = new BufferedWriter(fw); fw.write(write); fw.close();
Java 7+值得一试:
Files.write(Paths.get("./output.txt"), "Information string herer".getBytes());
它看起来很有希望
使用Google的Guava库,我们可以很容易地创build和写入文件。
package com.zetcode.writetofileex; import com.google.common.io.Files; import java.io.File; import java.io.IOException; public class WriteToFileEx { public static void main(String[] args) throws IOException { String fileName = "fruits.txt"; File file = new File(fileName); String content = "banana, orange, lemon, apple, plum"; Files.write(content.getBytes(), file); } }
该示例在项目根目录中创build一个新的fruits.txt
文件。
您甚至可以使用系统属性创build一个临时文件,这个系统属性将独立于您正在使用的操作系统。
File file = new File(System.*getProperty*("java.io.tmpdir") + System.*getProperty*("file.separator") + "YourFileName.txt");
对于多个文件你可以使用:
static void out(String[] name, String[] content) { File path = new File(System.getProperty("user.dir") + File.separator + "OUT"); for (File file : path.listFiles()) if (!file.isDirectory()) file.delete(); path.mkdirs(); File c; for (int i = 0; i != name.length; i++) { c = new File(path + File.separator + name[i] + ".txt"); try { c.createNewFile(); FileWriter fiWi = new FileWriter(c.getAbsoluteFile()); BufferedWriter buWi = new BufferedWriter(fiWi); buWi.write(content[i]); buWi.close(); } catch (IOException e) { e.printStackTrace(); } } }
这工作很好。
用JFilechooser读取与客户的集合并保存到文件中。
private void writeFile(){ JFileChooser fileChooser = new JFileChooser(this.PATH); int retValue = fileChooser.showDialog(this, "Save File"); if (retValue == JFileChooser.APPROVE_OPTION){ try (Writer fileWrite = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileChooser.getSelectedFile())))){ this.customers.forEach((c) ->{ try{ fileWrite.append(c.toString()).append("\n"); } catch (IOException ex){ ex.printStackTrace(); } }); } catch (IOException e){ e.printStackTrace(); } } }
创build一个示例文件:
try { File file = new File ("c:/new-file.txt"); if(file.createNewFile()) { System.out.println("Successful created!"); } else { System.out.println("Failed to create!"); } } catch (IOException e) { e.printStackTrace(); }