ใน Java ฉันมีข้อความจากเขตข้อมูลข้อความในตัวแปร String ที่เรียกว่า "text"
ฉันจะบันทึกเนื้อหาของตัวแปร "text" ไปยังไฟล์ได้อย่างไร?
ใน Java ฉันมีข้อความจากเขตข้อมูลข้อความในตัวแปร String ที่เรียกว่า "text"
ฉันจะบันทึกเนื้อหาของตัวแปร "text" ไปยังไฟล์ได้อย่างไร?
คำตอบ:
หากคุณเพียงแค่แสดงข้อความแทนที่จะเป็นข้อมูลไบนารี่ข้อมูลต่อไปนี้จะใช้ได้:
PrintWriter out = new PrintWriter("filename.txt");
จากนั้นเขียนสตริงของคุณเช่นเดียวกับที่คุณทำกับสตรีมเอาต์พุตใด ๆ :
out.println(text);
คุณจะต้องจัดการข้อยกเว้นเช่นเคย โปรดโทรหาout.close()
เมื่อคุณเขียนเสร็จแล้ว
หากคุณใช้ Java 7 หรือใหม่กว่าคุณสามารถใช้คำสั่ง " try-with-resources " ซึ่งจะปิดโดยอัตโนมัติPrintStream
เมื่อคุณทำเสร็จ (เช่นออกจากบล็อก) ดังนี้:
try (PrintWriter out = new PrintWriter("filename.txt")) {
out.println(text);
}
คุณจะต้องโยนอย่างชัดเจนjava.io.FileNotFoundException
ก่อนหน้านี้
Apache Commons IOมีวิธีการที่ยอดเยี่ยมสำหรับการทำเช่นนี้โดยเฉพาะอย่างยิ่ง FileUtils มีวิธีการดังต่อไปนี้:
static void writeStringToFile(File file, String data)
ซึ่งอนุญาตให้คุณเขียนข้อความไปยังไฟล์ในการเรียกใช้เมธอดเดียว:
FileUtils.writeStringToFile(new File("test.txt"), "Hello File");
คุณอาจต้องการพิจารณาระบุการเข้ารหัสสำหรับไฟล์ด้วย
FileUtils.writeStringToFile(new File("test.txt"), "Hello File", forName("UTF-8"));
ดูที่Java File API
ตัวอย่างรวดเร็ว:
try (PrintStream out = new PrintStream(new FileOutputStream("filename.txt"))) {
out.print(text);
}
@Cleanup new FileOutputStream(...)
แล้วเสร็จ
ใน Java 7 คุณสามารถทำได้:
String content = "Hello File!";
String path = "C:/a.txt";
Files.write( Paths.get(path), content.getBytes());
มีข้อมูลเพิ่มเติมได้ที่นี่: http://www.drdobbs.com/jvm/java-se-7-new-file-io/231600403
content.getBytes(StandardCharsets.UTF_8)
สามารถใช้เพื่อกำหนดการเข้ารหัสอย่างชัดเจน
ทำสิ่งที่คล้ายกันในโครงการของฉัน ใช้FileWriterจะทำให้งานของคุณง่ายขึ้น และที่นี่คุณสามารถค้นหาความสุขกวดวิชา
BufferedWriter writer = null;
try
{
writer = new BufferedWriter( new FileWriter( yourfilename));
writer.write( yourstring);
}
catch ( IOException e)
{
}
finally
{
try
{
if ( writer != null)
writer.close( );
}
catch ( IOException e)
{
}
}
.close()
จะไม่โยน (อย่างน้อยใน Java 7?) เป็นครั้งสุดท้ายที่พยายามซ้ำซ้อน?
throw new RuntimeException(e);
ใช้FileUtils.writeStringToFile()
จากApache Commons IO ไม่จำเป็นต้องบูรณาการล้อนี้โดยเฉพาะ
คุณสามารถใช้การแก้ไขโค้ดด้านล่างเพื่อเขียนไฟล์ของคุณจากคลาสหรือฟังก์ชั่นใดก็ตามที่จัดการข้อความ สิ่งหนึ่งที่สงสัยว่าทำไมโลกถึงต้องการเครื่องมือแก้ไขข้อความใหม่ ...
import java.io.*;
public class Main {
public static void main(String[] args) {
try {
String str = "SomeMoreTextIsHere";
File newTextFile = new File("C:/thetextfile.txt");
FileWriter fw = new FileWriter(newTextFile);
fw.write(str);
fw.close();
} catch (IOException iox) {
//do stuff with exception
iox.printStackTrace();
}
}
}
ในJava 11java.nio.file.Files
ระดับได้ขยายโดยสองวิธียูทิลิตี้ใหม่จะเขียนสตริงลงในไฟล์ วิธีแรก (ดู JavaDoc ที่นี่ ) ใช้ชุดอักขระUTF-8เป็นค่าเริ่มต้น:
Files.writeString(Path.of("my", "path"), "My String");
และวิธีที่สอง (ดู JavaDoc ที่นี่ ) อนุญาตให้ระบุชุดอักขระแต่ละชุด:
Files.writeString(Path.of("my", "path"), "My String", StandardCharset.ISO_8859_1);
ทั้งสองวิธีมีพารามิเตอร์ Varargs ซึ่งเป็นตัวเลือกสำหรับการตั้งค่าตัวเลือกการจัดการไฟล์ (ดู JavaDoc ที่นี่ ) ตัวอย่างต่อไปนี้จะสร้างไฟล์ที่ไม่มีอยู่หรือต่อท้ายสตริงกับไฟล์ที่มีอยู่:
Files.writeString(Path.of("my", "path"), "String to append", StandardOpenOption.CREATE, StandardOpenOption.APPEND);
ฉันชอบที่จะพึ่งพาห้องสมุดทุกครั้งที่เป็นไปได้สำหรับการดำเนินการประเภทนี้ สิ่งนี้ทำให้ฉันมีโอกาสน้อยที่จะไม่ได้ตั้งใจทำขั้นตอนสำคัญโดยไม่ตั้งใจ (เช่นข้อผิดพลาดของ ห้องสมุดบางคนมีข้อเสนอแนะข้างต้น แต่ที่ชื่นชอบสำหรับชนิดของสิ่งนี้คือGoogle ฝรั่ง Guava มีคลาสที่ชื่อว่าFilesซึ่งทำงานได้ดีสำหรับงานนี้:
// This is where the file goes.
File destination = new File("file.txt");
// This line isn't needed, but is really useful
// if you're a beginner and don't know where your file is going to end up.
System.out.println(destination.getAbsolutePath());
try {
Files.write(text, destination, Charset.forName("UTF-8"));
} catch (IOException e) {
// Useful error handling here
}
Charsets.UTF-8
กัน
Charsets.UTF_8
จริง ๆ แล้ว
Files.asCharSink(file, charset).write(text)
ใช้ Apache Commons IO api มันง่ายมาก
ใช้ API เป็น
FileUtils.writeStringToFile(new File("FileNameToWrite.txt"), "stringToWrite");
Maven พึ่งพา
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
ในกรณีที่คุณต้องการสร้างไฟล์ข้อความโดยใช้สตริงเดียว:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class StringWriteSample {
public static void main(String[] args) {
String text = "This is text to be saved in file";
try {
Files.write(Paths.get("my-file.txt"), text.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
ใช้สิ่งนี้มันสามารถอ่านได้มาก:
import java.nio.file.Files;
import java.nio.file.Paths;
Files.write(Paths.get(path), lines.getBytes(), StandardOpenOption.WRITE);
import java.io.*;
private void stringToFile( String text, String fileName )
{
try
{
File file = new File( fileName );
// if file doesnt exists, then create it
if ( ! file.exists( ) )
{
file.createNewFile( );
}
FileWriter fw = new FileWriter( file.getAbsoluteFile( ) );
BufferedWriter bw = new BufferedWriter( fw );
bw.write( text );
bw.close( );
//System.out.println("Done writing to " + fileName); //For testing
}
catch( IOException e )
{
System.out.println("Error: " + e);
e.printStackTrace( );
}
} //End method stringToFile
คุณสามารถแทรกวิธีนี้ในชั้นเรียนของคุณ หากคุณใช้วิธีนี้ในคลาสที่มีวิธีการหลักให้เปลี่ยนคลาสนี้เป็นแบบคงที่โดยเพิ่มคำสำคัญแบบคงที่ ไม่ว่าด้วยวิธีใดคุณจะต้องนำเข้า java.io. * เพื่อให้ใช้งานได้มิฉะนั้นจะไม่รู้จัก File, FileWriter และ BufferedWriter
คุณสามารถทำได้:
import java.io.*;
import java.util.*;
class WriteText
{
public static void main(String[] args)
{
try {
String text = "Your sample content to save in a text file.";
BufferedWriter out = new BufferedWriter(new FileWriter("sample.txt"));
out.write(text);
out.close();
}
catch (IOException e)
{
System.out.println("Exception ");
}
return ;
}
};
การใช้Java 7
:
public static void writeToFile(String text, String targetFilePath) throws IOException
{
Path targetPath = Paths.get(targetFilePath);
byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
Files.write(targetPath, bytes, StandardOpenOption.CREATE);
}
Files.write(targetPath, bytes);
เพื่อเขียนทับไฟล์นั้น มันจะทำงานได้ตามที่คาดไว้
ใช้ org.apache.commons.io.FileUtils:
FileUtils.writeStringToFile(new File("log.txt"), "my string", Charset.defaultCharset());
หากคุณสนใจที่จะส่งข้อความไปยังไฟล์เดียวบล็อกนี้จะเขียนทับทุกครั้ง
JFileChooser chooser = new JFileChooser();
int returnVal = chooser.showSaveDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
FileOutputStream stream = null;
PrintStream out = null;
try {
File file = chooser.getSelectedFile();
stream = new FileOutputStream(file);
String text = "Your String goes here";
out = new PrintStream(stream);
out.print(text); //This will overwrite existing contents
} catch (Exception ex) {
//do something
} finally {
try {
if(stream!=null) stream.close();
if(out!=null) out.close();
} catch (Exception ex) {
//do something
}
}
}
ตัวอย่างนี้อนุญาตให้ผู้ใช้เลือกไฟล์โดยใช้ตัวเลือกไฟล์
เป็นการดีกว่าที่จะปิดตัวเขียน / เอาต์พุตในบล็อกสุดท้ายในกรณีที่มีบางอย่างเกิดขึ้น
finally{
if(writer != null){
try{
writer.flush();
writer.close();
}
catch(IOException ioe){
ioe.printStackTrace();
}
}
}
private static void generateFile(String stringToWrite, String outputFile) {
try {
FileWriter writer = new FileWriter(outputFile);
writer.append(stringToWrite);
writer.flush();
writer.close();
log.debug("New File is generated ==>"+outputFile);
} catch (Exception exp) {
log.error("Exception in generateFile ", exp);
}
}
ฉันคิดว่าวิธีที่ดีที่สุดคือใช้Files.write(Path path, Iterable<? extends CharSequence> lines, OpenOption... options)
:
String text = "content";
Path path = Paths.get("path", "to", "file");
Files.write(path, Arrays.asList(text));
ดูjavadoc :
เขียนบรรทัดของข้อความไปยังไฟล์ แต่ละบรรทัดเป็นลำดับถ่านและถูกเขียนไปยังไฟล์ตามลำดับโดยแต่ละบรรทัดถูกยกเลิกโดยตัวแยกบรรทัดของแพลตฟอร์มตามที่กำหนดโดยคุณสมบัติของระบบ line.separator อักขระถูกเข้ารหัสเป็นไบต์โดยใช้ชุดอักขระที่ระบุ
พารามิเตอร์ options ระบุวิธีการสร้างหรือเปิดไฟล์ หากไม่มีตัวเลือกอยู่วิธีนี้จะทำงานเหมือนกับว่ามีตัวเลือก CREATE, TRUNCATE_EXISTING และ WRITE กล่าวอีกนัยหนึ่งมันจะเปิดไฟล์สำหรับการเขียนการสร้างไฟล์หากไม่มีอยู่หรือเริ่มต้นการตัดทอนไฟล์ปกติที่มีอยู่ให้มีขนาดเท่ากับ 0 วิธีนี้ทำให้มั่นใจได้ว่าไฟล์จะถูกปิดเมื่อเขียนทุกบรรทัด ( หรือข้อผิดพลาด I / O หรือข้อผิดพลาดรันไทม์อื่น ๆ ถูกส่งออกไป) หากเกิดข้อผิดพลาด I / O อาจเกิดขึ้นหลังจากไฟล์ถูกสร้างขึ้นหรือถูกตัดทอนหรือหลังจากนั้นบางไบต์ได้ถูกเขียนไปยังไฟล์
โปรดทราบว่า ฉันเห็นผู้คนตอบแล้วด้วย Java ที่มีอยู่แล้วFiles.write
แต่สิ่งที่พิเศษในคำตอบของฉันที่ไม่มีใครพูดถึงคือรุ่นที่โอเวอร์โหลดของวิธีที่ใช้ Iterable ของ CharSequence (เช่น String) แทนที่จะเป็นbyte[]
อาร์เรย์ดังนั้นจึงtext.getBytes()
ไม่จำเป็น ซึ่งฉันคิดว่าสะอาดกว่าเล็กน้อย
หากคุณต้องการเก็บอักขระขึ้นบรรทัดใหม่จากสตริงลงในไฟล์ที่นี่เป็นตัวอย่างรหัส:
jLabel1 = new JLabel("Enter SQL Statements or SQL Commands:");
orderButton = new JButton("Execute");
textArea = new JTextArea();
...
// String captured from JTextArea()
orderButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
// When Execute button is pressed
String tempQuery = textArea.getText();
tempQuery = tempQuery.replaceAll("\n", "\r\n");
try (PrintStream out = new PrintStream(new FileOutputStream("C:/Temp/tempQuery.sql"))) {
out.print(tempQuery);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(tempQuery);
}
});
วิธีของฉันขึ้นอยู่กับกระแสข้อมูลเนื่องจากการทำงานบน Android ทุกรุ่นและความต้องการทรัพยากร fecthing เช่น URL / URI ข้อเสนอแนะใด ๆ ยินดีต้อนรับ
เท่าที่เกี่ยวข้องสตรีม (InputStream และ OutputStream) ถ่ายโอนข้อมูลไบนารีเมื่อนักพัฒนาไปเขียนสตริงลงในสตรีมก่อนอื่นต้องแปลงเป็นไบต์หรือพูดอีกอย่างหนึ่งว่าเข้ารหัส
public boolean writeStringToFile(File file, String string, Charset charset) {
if (file == null) return false;
if (string == null) return false;
return writeBytesToFile(file, string.getBytes((charset == null) ? DEFAULT_CHARSET:charset));
}
public boolean writeBytesToFile(File file, byte[] data) {
if (file == null) return false;
if (data == null) return false;
FileOutputStream fos;
BufferedOutputStream bos;
try {
fos = new FileOutputStream(file);
bos = new BufferedOutputStream(fos);
bos.write(data, 0, data.length);
bos.flush();
bos.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
Logger.e("!!! IOException");
return false;
}
return true;
}
คุณสามารถใช้ ArrayList เพื่อใส่เนื้อหาทั้งหมดของ TextArea สำหรับตัวอย่างและส่งเป็นพารามิเตอร์โดยการเรียกบันทึกเป็นนักเขียนเพียงแค่เขียนสายสตริงจากนั้นเราจะใช้ "สำหรับ" บรรทัดโดยเขียน ArrayList ของเราในตอนท้าย เราจะเป็นเนื้อหา TextArea ในไฟล์ txt หากสิ่งที่ไม่สมเหตุสมผลฉันขอโทษ Google แปลและฉันที่ไม่พูดภาษาอังกฤษ
ดู Windows Notepad มันไม่ได้ข้ามเส้นเสมอไปและแสดงทั้งหมดในบรรทัดเดียวใช้ Wordpad ok
private void SaveActionPerformed(java.awt.event.ActionEvent evt) {
String NameFile = Name.getText();
ArrayList< String > Text = new ArrayList< String >();
Text.add(TextArea.getText());
SaveFile(NameFile, Text);
}
public void SaveFile(String name, ArrayList< String> message) {
path = "C:\\Users\\Paulo Brito\\Desktop\\" + name + ".txt";
File file1 = new File(path);
try {
if (!file1.exists()) {
file1.createNewFile();
}
File[] files = file1.listFiles();
FileWriter fw = new FileWriter(file1, true);
BufferedWriter bw = new BufferedWriter(fw);
for (int i = 0; i < message.size(); i++) {
bw.write(message.get(i));
bw.newLine();
}
bw.close();
fw.close();
FileReader fr = new FileReader(file1);
BufferedReader br = new BufferedReader(fr);
fw = new FileWriter(file1, true);
bw = new BufferedWriter(fw);
while (br.ready()) {
String line = br.readLine();
System.out.println(line);
bw.write(line);
bw.newLine();
}
br.close();
fr.close();
} catch (IOException ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog(null, "Error in" + ex);
}
}