The most common way to read and write files in Java is to use the java.io package. The specific methods include: 1. Use FileReader and FileWriter to perform character-level reading and writing text files, which is suitable for processing human-readable text content; 2. Use BufferedReader and BufferedWriter to provide a buffering mechanism to improve the efficiency of reading and writing text by line, which is suitable for log analysis and configuration file parsing; 3. Use FileInputStream and FileOutputStream to process binary files, which is suitable for copying pictures, network transmission and other scenarios. These classes provide flexible choices based on the data type and operation method. It is recommended to combine try-with-resources to automatically manage resources and pay attention to exception handling and coding issues.
The most basic and most commonly used way to read and write files in Java is to use the Java I/O package ( java.io
). It provides a series of classes to handle input and output operations, and although there are more modern ways such as NIO ( java.nio
), java.io
is still a standard practice that is still used in many projects. The following are several common methods and usage scenarios.

Use FileReader
and FileWriter
to read and write text files
These two classes are suitable for handling character streams, that is, plain text files. They read or write content by character, suitable for human-readable text such as English and Chinese.

Example of reading file:
try (FileReader reader = new FileReader("input.txt")) { int character; while ((character = reader.read()) != -1) { System.out.print((char) character); } } catch (IOException e) { e.printStackTrace(); }
Example of writing to a file:

try (FileWriter writer = new FileWriter("output.txt")) { writer.write("This is what to write"); } catch (IOException e) { e.printStackTrace(); }
- It is recommended to use try-with-resources to automatically close resources.
- If you just simply read and write text, this method is simple and direct enough.
- Pay attention to encoding issues. If the file is not the default encoding (usually UTF-8), you may need to specify the encoding method (it is recommended to use InputStreamReader/OutputStreamWriter with FileInputStream/FileOutputStream).
Improve efficiency with BufferedReader
and BufferedWriter
When you need to read or write text by line, it is recommended to use a buffered class, which can reduce the number of system calls and improve performance.
Example of reading by line:
try (BufferedReader reader = new BufferedReader(new FileReader("input.txt"))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); }
Line by line writing example:
try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) { writer.write("first line"); writer.newLine(); // newline writer.write("second line"); } catch (IOException e) { e.printStackTrace(); }
- The buffering mechanism allows as much data as possible for each read and write, suitable for large files.
-
readLine()
method is very convenient and is suitable for log analysis, configuration file analysis and other scenarios. - If you need to frequently press rows, this combination is a good choice.
Handling binary files using FileInputStream
and FileOutputStream
If you are reading and writing pictures, videos, audio, or other files in non-text formats, you should use a byte stream instead of a character stream.
Example of copying an image file:
try (FileInputStream in = new FileInputStream("source.jpg"); FileOutputStream out = new FileOutputStream("copy.jpg")) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } } catch (IOException e) { e.printStackTrace(); }
- Byte streams operate data in units of
byte[]
and do not involve character encoding conversion. - It is often used in scenarios such as copying files, network transmission, encryption and decryption.
- The buffer size can be adjusted according to actual conditions, such as 8KB or 64KB, which may be more efficient.
Basically that's it. Java I/O provides a variety of flexible classes to deal with different read and write needs. The key is to select the appropriate class based on the data type (text or binary) and operation method (character, line by line, batch). Although the code seems a bit cumbersome, after understanding the concept of streams, it is actually not complicated. It is just easy to ignore details, such as forgetting to close the stream or not handling exceptions.
The above is the detailed content of How to read and write files in Java I/O?. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

The difference between HashMap and Hashtable is mainly reflected in thread safety, null value support and performance. 1. In terms of thread safety, Hashtable is thread-safe, and its methods are mostly synchronous methods, while HashMap does not perform synchronization processing, which is not thread-safe; 2. In terms of null value support, HashMap allows one null key and multiple null values, while Hashtable does not allow null keys or values, otherwise a NullPointerException will be thrown; 3. In terms of performance, HashMap is more efficient because there is no synchronization mechanism, and Hashtable has a low locking performance for each operation. It is recommended to use ConcurrentHashMap instead.

Java uses wrapper classes because basic data types cannot directly participate in object-oriented operations, and object forms are often required in actual needs; 1. Collection classes can only store objects, such as Lists use automatic boxing to store numerical values; 2. Generics do not support basic types, and packaging classes must be used as type parameters; 3. Packaging classes can represent null values ??to distinguish unset or missing data; 4. Packaging classes provide practical methods such as string conversion to facilitate data parsing and processing, so in scenarios where these characteristics are needed, packaging classes are indispensable.

StaticmethodsininterfaceswereintroducedinJava8toallowutilityfunctionswithintheinterfaceitself.BeforeJava8,suchfunctionsrequiredseparatehelperclasses,leadingtodisorganizedcode.Now,staticmethodsprovidethreekeybenefits:1)theyenableutilitymethodsdirectly

The JIT compiler optimizes code through four methods: method inline, hot spot detection and compilation, type speculation and devirtualization, and redundant operation elimination. 1. Method inline reduces call overhead and inserts frequently called small methods directly into the call; 2. Hot spot detection and high-frequency code execution and centrally optimize it to save resources; 3. Type speculation collects runtime type information to achieve devirtualization calls, improving efficiency; 4. Redundant operations eliminate useless calculations and inspections based on operational data deletion, enhancing performance.

Instance initialization blocks are used in Java to run initialization logic when creating objects, which are executed before the constructor. It is suitable for scenarios where multiple constructors share initialization code, complex field initialization, or anonymous class initialization scenarios. Unlike static initialization blocks, it is executed every time it is instantiated, while static initialization blocks only run once when the class is loaded.

Factory mode is used to encapsulate object creation logic, making the code more flexible, easy to maintain, and loosely coupled. The core answer is: by centrally managing object creation logic, hiding implementation details, and supporting the creation of multiple related objects. The specific description is as follows: the factory mode handes object creation to a special factory class or method for processing, avoiding the use of newClass() directly; it is suitable for scenarios where multiple types of related objects are created, creation logic may change, and implementation details need to be hidden; for example, in the payment processor, Stripe, PayPal and other instances are created through factories; its implementation includes the object returned by the factory class based on input parameters, and all objects realize a common interface; common variants include simple factories, factory methods and abstract factories, which are suitable for different complexities.

InJava,thefinalkeywordpreventsavariable’svaluefrombeingchangedafterassignment,butitsbehaviordiffersforprimitivesandobjectreferences.Forprimitivevariables,finalmakesthevalueconstant,asinfinalintMAX_SPEED=100;wherereassignmentcausesanerror.Forobjectref

There are two types of conversion: implicit and explicit. 1. Implicit conversion occurs automatically, such as converting int to double; 2. Explicit conversion requires manual operation, such as using (int)myDouble. A case where type conversion is required includes processing user input, mathematical operations, or passing different types of values ??between functions. Issues that need to be noted are: turning floating-point numbers into integers will truncate the fractional part, turning large types into small types may lead to data loss, and some languages ??do not allow direct conversion of specific types. A proper understanding of language conversion rules helps avoid errors.
