«» преобразуется в «» при копировании содержимого одного файла в другой - PullRequest
0 голосов
/ 19 сентября 2018

Здесь я пытаюсь скопировать содержимое одного файла в другой.Содержание должно быть точно таким же, но я получаю некоторые аномалии.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        BufferedReader br = null;
        BufferedWriter bw =null;
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter the input file name");
        String input = scan.nextLine();
        System.out.println("Enter the output file name");
        String output = scan.nextLine();
        try {
            br = new BufferedReader(new InputStreamReader(
                    new FileInputStream(input), "UTF-8"));
            bw = new BufferedWriter(new OutputStreamWriter(
                    new FileOutputStream(output)));
            int ch = 0;
            while((ch = br.read()) != -1){
                bw.write((char)ch);
            }
        } catch (IOException e) {
        }
        finally
        {
            try {
                if(br != null && bw != null){
                br.close();
                bw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        scan.close();
    }
}

Пользователь должен ввести имя входного файла, и содержимое входного файла будет скопировано во введенное имя выходного файла.

testInput.txt

Я бы дал себе год на то, чтобы начать новый журнал в Берлине, чтобы запечатлеть дух времени, наслаждаясь культурным стимулом города , сталкиваясь с ожидаемыми трудностями, собирая необходимые деньги..

testOutput.txt

Я дал себе год, чтобы начать новый журнал в Берлине, чтобызахватите дух времени, наслаждаясь культурной ценностью города , столкнувшись с ожидаемыми вызовами, собирающими необходимые деньги.

Ответы [ 4 ]

0 голосов
/ 20 сентября 2018

Если вы хотите видеть содержимое как есть, вы должны использовать метод без параметра charset.В этом случае он выберет стиль по умолчанию.

try {
    br = new BufferedReader(new InputStreamReader(new FileInputStream(input)));
   ...
}
0 голосов
/ 19 сентября 2018

Ваша проблема связана с кодировкой символов.

Вы используете UTF-8, но похоже, что он не может отображать символ (который является символом ASCII 8217 ).

Итак, вы можете либо:

  1. Использовать кодировку как CP1252 (br = new BufferedReader(new InputStreamReader( new FileInputStream(input), "CP1252"));)
  2. , либо использовать символ ASCII 39 - апостроф .
0 голосов
/ 19 сентября 2018

Комментарий «Что вы используете для просмотра ввода, что для просмотра вывода?»это то, что вы должны действовать.

Что заставило вас прийти к выводу, что «содержание» выходных данных включает эти знаки евро и тм?Строки в текстовых файлах также имеют кодировку, и первое, о чем вы должны подумать, это убедиться, что инструмент, который вы используете для просмотра, действительно правильно обрабатывает эту кодировку.

Странные токены, перед которыми часто предают utf8 закодированных файлов, просматриваемых с помощью примитивного инструмента, такого как блокнот, который использует схему кодирования один байт на символ, часто iso-8859-1.Ошибка не в файле, а в выборе инструмента просмотра.

Другими словами: файлы содержат только байты.Даже если они имеют суффикс ".txt".Даже если эти байты представляют «просто строки», все равно происходит кодирование / декодирование, и что каждый отдельный инструмент в цепочке от создания / записи байтов до просмотра / чтения байтов должен знать, какое кодирование использовалось.Инструменты очень часто слепо принимают кодировку машины по умолчанию, и в наши дни, когда utf-8 определенно набирает обороты, это предположение часто ошибочно.(Особенно на машинах Windows.)

0 голосов
/ 19 сентября 2018

try bw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(output), StandardCharsets.UTF_8)));, поскольку документация OutputStreamWriter гласит:

Если вы не укажете один, он просто использует кодировку файла по умолчанию для локали по умолчанию.

...