betacode

Руководство Java Writer

  1. Writer
  2. write(int)
  3. write(char[])
  4. write(char[], int, int)
  5. close()
  6. write(String)
  7. write(String, int, int)
  8. append(CharSequence)
  9. append(CharSequence, int , int)
  10. append(char)
  11. flush()

1. Writer

Writer - это класс в package java.io, который является базовым классом, представляющим поток символов (stream of characters) для записи символов в целевой объект, такой как текстовый файл.
public abstract class Writer implements Appendable, Closeable, Flushable
В принципе, вы не можете использовать класс Writer напрямую, потому что это абстрактный класс. Но в конкретном случае вы можете использовать один из его подклассов.
Рассмотрим сценарий записи следующих символов в файл с кодировкой UTF-8:
JP日本-八洲
Java использует 2 bytes для хранения символа, и ниже приведена иллюстрация bytes вышеупомянутого текста:
FileWriter - это подкласс Writer, обычно используемый для записи символов в текстовый файл. Каждый символ в Writer составляет 2 bytes, но при записи их в текстовый файл UTF-8 каждый символ может быть сохранен на 1, 2, 3 или 4 bytes.
См. Также мое объяснение того, как Java преобразует символы Java в символы UTF-8:
Writer methods
public static Writer nullWriter()

public void write(int c) throws IOException

public void write(char cbuf[]) throws IOException

public void write(char cbuf[], int off, int len) throws IOException

public void write(String str) throws IOException

public void write(String str, int off, int len) throws IOException

public Writer append(CharSequence csq) throws IOException

public Writer append(CharSequence csq, int start, int end) throws IOException

public Writer append(char c) throws IOException

public void flush() throws IOException

public void close() throws IOException

2. write(int)

public void write(int chr) throws IOException
Запишем символ в Writer. Параметр chr - это код символа, который представляет собой целое число от 0 до 65535. Если значение chr выходит за пределы указанного выше диапазона, оно будет проигнорировано.
Writer_write_ex1.java
package org.o7planning.writer.ex;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.nio.charset.StandardCharsets;

public class Writer_write_ex1 {

    // Windows path: C:/Somedirectory/out-file.txt
    private static final String file_path = "/Volumes/Data/test/out-file.txt";

    public static void main(String[] args) throws IOException {
        File file = new File(file_path);
        // Create parent folder:
        file.getParentFile().mkdirs();

        // FileWriter constructor in Java 11.
        Writer writer = new FileWriter(file, StandardCharsets.UTF_8);

        writer.write((int)'J'); // 74
        
        writer.write((int)'P'); // 80
        
        writer.write((int)'日'); // 26085  
        
        writer.write(26412);     // 本
        
        writer.write((int)'-');  // 45
        
        writer.write(20843);    // 八
        
        writer.write((int)'洲'); // 27954
        
        writer.close();
    }
}
Output:
out-file.txt
JP日本-八洲

3. write(char[])

public void write(char[] cbuf) throws IOException
Запишем массив символов в Writer.
Writer_write_ex2.java
package org.o7planning.writer.ex;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.nio.charset.StandardCharsets;

public class Writer_write_ex2 {

    // Windows path: C:/Somedirectory/out-file.txt
    private static final String file_path = "/Volumes/Data/test/out-file.txt";

    public static void main(String[] args) throws IOException {
        File file = new File(file_path);
        // Create parent folder:
        file.getParentFile().mkdirs();

        // FileWriter constructor in Java 11.
        Writer writer = new FileWriter(file, StandardCharsets.UTF_8);

        writer.write((int)'J'); // 74
        
        char[] cbuf = new char[] {'P', '日', '本', '-', '八', '洲'};
        
        writer.write(cbuf);  
        
        writer.close();
    }
}
Output:
out-file.txt
JP日本-八洲

4. write(char[], int, int)

public void write(char[] cbuf, int off, int len) throws IOException
Запишем часть массива символов в Writer. Запишем символы из индекса offset в индекс offset+len.
Writer_write_ex3.java
package org.o7planning.writer.ex;

import java.io.IOException;
import java.io.StringWriter;

public class Writer_write_ex3 {

    public static void main(String[] args) throws IOException {
        // StringWriter is a subclass of Writer.
        StringWriter stringWriter = new StringWriter();  
        
        char[] cbuf = new char[] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        
        stringWriter.write(cbuf, 2, 5); // '2', ...'6'
        
        String s = stringWriter.toString();
        System.out.println(s);
        
        stringWriter.close();
    }
}
Output:
23456

5. close()

public void close() throws IOException
Метод close() используется для закрытия этого stream, сначала будет вызван метод flush(). Как только stream будет закрыт, дальнейшие вызовы write() или flush() вызовут исключение IOException. Закрытие ранее закрытого потока не имеет никакого эффекта.
public interface Closeable extends AutoCloseable
Класс Writer реализует интерфейс Closeable. Если вы пишете код в соответствии с правилами AutoCloseable, система автоматически закроет stream для вас, не вызывая метод close() напрямую.
Writer_close_ex1.java
package org.o7planning.writer.ex;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.nio.charset.StandardCharsets;

public class Writer_close_ex1 {

    // Windows path: C:/Somedirectory/out-file.txt
    private static final String file_path = "/Volumes/Data/test/out-file.txt";

    public static void main(String[] args) throws IOException {
        File file = new File(file_path);
        // Create parent folder:
        file.getParentFile().mkdirs();
        
        try (Writer writer = new FileWriter(file, StandardCharsets.UTF_8)) {
            writer.write((int) 'J'); // 74
            writer.write((int) 'P'); // 80
            writer.write((int) '日'); // 26085
            writer.write(26412); // 本
            writer.write((int) '-'); // 45
            writer.write(20843); // 八
            writer.write((int) '洲'); // 27954
        }
    }
}
  • Руководство Java Closeable

6. write(String)

public void write(String str) throws IOException
Напишем String в Writer.
Например:
writer.write("Some String");

7. write(String, int, int)

public void write(String str, int offset, int len) throws IOException
Запишем часть String в Writer. Запись символов из индекса offset до индекса offset+len в Writer.
Например:
writer.write("0123456789", 2, 5); // 23456

8. append(CharSequence)

public Writer append(CharSequence csq) throws IOException
Добавим символы CharSequence в Writer. Этот метод возвращает текущий объект Writer, который позволяет вызывать другой метод Writer вместо того, чтобы заканчиваться точкой с запятой ( ; ).
Writer_append_ex1.java
package org.o7planning.writer.ex;

import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;

public class Writer_append_ex1 {

    public static void main(String[] args) throws IOException {
        // StringWriter is a subclass of Writer.
        Writer writer = new StringWriter();

        writer.append("01234").append("5678").write("9");

        System.out.println(writer.toString()); // 0123456789

        writer.close();
    }
}

9. append(CharSequence, int , int)

public Writer append(CharSequence csq, int start, int end) throws IOException
Добавим часть CharSequence в Writer. Этот метод возвращает текущий объект Writer.

10. append(char)

public Writer append(char chr) throws IOException
Добавим символ в Writer. Этот метод возвращает текущий объект Writer, который позволяет вызывать другой метод Writer вместо того, чтобы заканчиваться точкой с запятой ( ; ).
Writer_append_ex2.java
package org.o7planning.writer.ex;

import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;

public class Writer_append_ex2 {

    public static void main(String[] args) throws IOException {

        Writer writer = new StringWriter();

        writer.append('J').append('P').append('日').append('本');

        System.out.println(writer.toString()); // JP日本
        writer.close();
    }
}

11. flush()

public void flush() throws IOException
Данные, которые вы записываете в Writer, иногда временно хранятся в буфере, метод flush() используется для сброса (flush) всех данных из буфера в целевой объект.
Вы можете прочитать статью BufferedWriter ниже, чтобы узнать больше о методе flush().
Если предполагаемым местом назначения этого Writer является абстракция, предоставляемая базовой операционной системой, например файл, то очистка stream гарантирует только то, что символы, ранее записанные в stream, передаются в операционную систему для записи; это не гарантирует, что они действительно записаны на физическое устройство, такое как дисковод.

Руководства Java IO

Show More