Я предлагаю использовать QueryPath для синтаксического разбора XML и HTML в PHP. В основном это тот же синтаксис, что и jQuery, только на стороне сервера.
Обратите внимание, что каждый из примеров кода ниже может выдать IOException
. Блоки try / catch / finally для краткости опущены.
Создание текстового файла (обратите внимание, что это будет перезаписывать файл, если он уже существует):
PrintWriter writer = new PrintWriter("the-file-name.txt", "UTF-8");
writer.println("The first line");
writer.println("The second line");
writer.close();
Создание двоичного файла (это также перезапишет файл):
byte data[] = ...
FileOutputStream out = new FileOutputStream("the-file-name");
out.write(data);
out.close();
Пользователи Java 7+ могут использовать класс Files
для записи в файлы :
Создание текстового файла:
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);
Создание двоичного файла:
byte data[] = ...
Path file = Paths.get("the-file-name");
Files.write(file, data);
//Files.write(file, data, StandardOpenOption.APPEND);
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();
}
}
}
}
output.close()
выбрасывает IOException
– Bob Yoplait
9 November 2017 в 16:19
Если у вас уже есть контент, который вы хотите записать в файл (и не генерируется «на лету»), добавление java.nio.file.Files
в Java 7 как часть встроенного ввода-вывода обеспечивает простейший и наиболее эффективный способ достижения ваших целей.
В основном создание и запись в файл - это только одна строка, более того, один простой вызов метода!
В следующем примере создается и записывается 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();
}
Если мы используем Java 7 и выше, а также знаем, какой контент будет добавлен (добавлен) в файл, мы можем использовать метод newBufferedWriter в пакете NIO.
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
, в которой ресурсы автоматически закрываются после попытки. Хотя OP не спросил, но на всякий случай мы хотим искать строки с определенным ключевым словом, например confidential
мы можем использовать потоковые API в Java:
//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();
}
Используя Google Guava-библиотеку, мы можем легко создать и записать файл.
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);
}
}
В примере создается новый файл fruits.txt
в корневом каталоге проекта.
Только одна строка! path
и line
являются строками
import java.nio.file.Files;
import java.nio.file.Paths;
Files.write(Paths.get(path), lines.getBytes());
lines
. Если это java.lang.String
, то вызов getBytes()
будет генерировать байты с использованием платформы default , что не очень хорошо в общем случае.
– afk5min
13 May 2015 в 04:45
Вот некоторые из возможных способов создания и записи файла в Java:
Использование FileOutputStream
try {
File fout = new File("myOutFile.txt");
FileOutputStream fos = new FileOutputStream(fout);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));
bw.write("Write somthing to the file ...");
bw.newLine();
bw.close();
} catch (FileNotFoundException e){
// File was not found
e.printStackTrace();
} catch (IOException e) {
// Problem when writing to the file
e.printStackTrace();
}
Использование FileWriter
try {
FileWriter fw = new FileWriter("myOutFile.txt");
fw.write("Example of content");
fw.close();
} catch (FileNotFoundException e) {
// File not found
e.printStackTrace();
} catch (IOException e) {
// Error when writing to the file
e.printStackTrace();
}
Использование PrintWriter
try {
PrintWriter pw = new PrintWriter("myOutFile.txt");
pw.write("Example of content");
pw.close();
} catch (FileNotFoundException e) {
// File not found
e.printStackTrace();
} catch (IOException e) {
// Error when writing to the file
e.printStackTrace();
}
Использование OutputStreamWriter
try {
File fout = new File("myOutFile.txt");
FileOutputStream fos = new FileOutputStream(fout);
OutputStreamWriter osw = new OutputStreamWriter(fos);
osw.write("Soe content ...");
osw.close();
} catch (FileNotFoundException e) {
// File not found
e.printStackTrace();
} catch (IOException e) {
// Error when writing to the file
e.printStackTrace();
}
Для дополнительной проверки этого руководства о том, как читать и записывать файлы в Java .
Если вы по какой-то причине хотите отделить действие создания и записи, эквивалент Java touch
-
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()
, проверка наличия и файл создаются атомарно. Это может быть полезно, если вы хотите, чтобы вы были создателем файла, прежде чем писать его, например.
touch
в общем смысле, а скорее в своем общем вторичном использовании для создания файла без записи данных на него. Задокументированная цель - обновить временную метку файла. Создание файла, если оно не существует, действительно является побочным эффектом и может быть отключено с помощью переключателя.
– Mark Peters
21 August 2013 в 20:30
exists()/createNewFile()
последовательности буквально являются пустой тратой времени и пространства.
– user207421
26 November 2016 в 02:25
Вот небольшая примерная программа для создания или перезаписывания файла. Это длинная версия, поэтому ее легче понять.
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/bin/images/statsTest.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();
}
}
Чтение коллекции с клиентами и сохранение в файл с помощью 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();
}
}
}
close()
в любом потоке, обернутом вокруг любого другого, также закроет все внутренние потоки.
– Nic Hartley
18 November 2014 в 18:23
StandardCharsets.UTF_8
вместо "utf-8" String (Это предотвращает появление опечаток) ...new OutputStreamWriter(new FileOutputStream("myFile.txt"), StandardCharsets.UTF_8)...
- java.nio.charset.StandardCharsets
введен в java 7
– Ralph
29 March 2015 в 11:32
File.exists()/createNewFile()
не имеет смысла и бесполезен. Операционная система уже должна делать то же самое, когда создается new FileWriter()
. Вы заставляете все это происходить дважды.
– user207421
26 November 2016 в 02:22
FileNotFoundException
, который вызывается, когда операция завершается с ошибкой.
– user207421
26 November 2016 в 02:23
exists()/createNewFile()
последовательности буквально являются пустой тратой времени и пространства.
– user207421
26 November 2016 в 02:26
FileWriter
следующим образом: new FileWriter(file.getAbsoluteFile(),true)
– Adelin
23 February 2018 в 08:14
В Java 8 используйте файлы и пути и используя конструкцию try-with-resources.
import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class WriteFile{
public static void main(String[] args) throws IOException {
String file = "text.txt";
System.out.println("Writing to file: " + file);
// Files.newBufferedWriter() uses UTF-8 encoding by default
try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(file))) {
writer.write("Java\n");
writer.write("Python\n");
writer.write("Clojure\n");
writer.write("Scala\n");
writer.write("JavaScript\n");
} // the file will be automatically closed
}
}
Если вы хотите иметь относительно безболезненный опыт, вы также можете взглянуть на пакет Apache Commons IO , более конкретно класс FileUtils
.
Никогда не забывайте проверять сторонние библиотеки. Joda-Time для обработки даты, Apache Commons Lang StringUtils
для обычных операций с строками и, таким образом, сделает ваш код более читаемым.
Java - отличный язык, но стандартная библиотека иногда немного низкоуровневая. Мощный, но низкий уровень, тем не менее.
FileUtils
- static void write(File file, CharSequence data)
. Пример использования: import org.apache.commons.io.FileUtils;
FileUtils.write(new File("example.txt"), "string with data");
. FileUtils
также имеет writeLines
, который принимает Collection
строк.
– Rory O'Kane
31 January 2014 в 01:51
лучший способ - использовать Java7: Java 7 вводит новый способ работы с файловой системой, а также новый класс утилиты - Files. Используя класс Files, мы можем создавать, перемещать, копировать, удалять файлы и каталоги; его также можно использовать для чтения и записи в файл.
public void saveDataInFile(String data) throws IOException {
Path path = Paths.get(fileName);
byte[] strToBytes = data.getBytes();
Files.write(path, strToBytes);
}
Запись с помощью FileChannel. Если вы имеете дело с большими файлами, FileChannel может быть быстрее стандартного ввода-вывода. Следующий код записывает String в файл с помощью FileChannel:
public void saveDataInFile(String data)
throws IOException {
RandomAccessFile stream = new RandomAccessFile(fileName, "rw");
FileChannel channel = stream.getChannel();
byte[] strBytes = data.getBytes();
ByteBuffer buffer = ByteBuffer.allocate(strBytes.length);
buffer.put(strBytes);
buffer.flip();
channel.write(buffer);
stream.close();
channel.close();
}
Запись с помощью DataOutputStream
public void saveDataInFile(String data) throws IOException {
FileOutputStream fos = new FileOutputStream(fileName);
DataOutputStream outStream = new DataOutputStream(new BufferedOutputStream(fos));
outStream.writeUTF(data);
outStream.close();
}
Запись с помощью FileOutputStream
Давайте посмотрим, как мы можем используйте FileOutputStream для записи двоичных данных в файл. Следующий код преобразует строковый int bytes и записывает байты в файл с помощью FileOutputStream:
public void saveDataInFile(String data) throws IOException {
FileOutputStream outputStream = new FileOutputStream(fileName);
byte[] strToBytes = data.getBytes();
outputStream.write(strToBytes);
outputStream.close();
}
Write with PrintWriter мы можем использовать PrintWriter для записи форматированного текста в файл:
public void saveDataInFile() throws IOException {
FileWriter fileWriter = new FileWriter(fileName);
PrintWriter printWriter = new PrintWriter(fileWriter);
printWriter.print("Some String");
printWriter.printf("Product name is %s and its price is %d $", "iPhone", 1000);
printWriter.close();
}
Запись с помощью BufferedWriter: используйте BufferedWriter для записи String в новый файл:
public void saveDataInFile(String data) throws IOException {
BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
writer.write(data);
writer.close();
}
добавьте строку в существующий файл:
public void saveDataInFile(String data) throws IOException {
BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, true));
writer.append(' ');
writer.append(data);
writer.close();
}
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();
}
}
}
exists()/createNewFile()
последовательности буквально являются пустой тратой времени и пространства.
– user207421
26 November 2016 в 02:25
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");
}
}
exists()/createNewFile()
последовательности буквально являются пустой тратой времени и пространства.
– user207421
26 November 2016 в 02:25
Вы даже можете создать временный файл с использованием системного свойства, которое не зависит от используемой ОС.
File file = new File(System.*getProperty*("java.io.tmpdir") +
System.*getProperty*("file.separator") +
"YourFileName.txt");
close()
в любом потоке, обернутом вокруг любого другого, также закроет все внутренние потоки.
– Nic Hartley
18 November 2014 в 18:23
StandardCharsets.UTF_8
вместо "utf-8" String (Это предотвращает появление опечаток) ...new OutputStreamWriter(new FileOutputStream("myFile.txt"), StandardCharsets.UTF_8)...
- java.nio.charset.StandardCharsets
введен в java 7
– Ralph
29 March 2015 в 11:32
File.exists()/createNewFile()
не имеет смысла и бесполезен. Операционная система уже должна делать то же самое, когда создается new FileWriter()
. Вы заставляете все это происходить дважды.
– user207421
26 November 2016 в 02:22
FileNotFoundException
, который вызывается, когда операция завершается с ошибкой.
– user207421
26 November 2016 в 02:23
exists()/createNewFile()
последовательности буквально являются пустой тратой времени и пространства.
– user207421
26 November 2016 в 02:26
FileWriter
следующим образом: new FileWriter(file.getAbsoluteFile(),true)
– Adelin
23 February 2018 в 08:14
"PrintWriter prints formatted representations of objects to a text-output stream. "
Ответ Божо более правильный, хотя он выглядит громоздким (вы всегда можете обернуть его каким-то способом утилиты). – leonbloy 21 May 2010 в 21:40writer.close()
должен быть в блоке finally – Thierry 11 May 2017 в 22:16