Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
 Аватар для olexiy86
32 / 30 / 11
Регистрация: 27.09.2014
Сообщений: 359

Как изменить байт в потоке InpuStream

20.05.2016, 00:35. Показов 2059. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос собственно вот в чём, есть текстовый файл "text.txt" с содержанием "@>" Задача считать файл в поток, изменить содержание файла на ">@" и записать это в файл "text(2).txt". Вот что у меня получилось :
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import javax.xml.crypto.Data;
import java.io.*;
import java.util.Date;
 
import static java.lang.System.*;
 
/**
 * Created by Alex on 18.05.2016.
 */
public class Main {
    public  static  void main(String[] args) throws IOException {
        
        FileInputStream fileInputStream = new FileInputStream("text.txt");
        
        FileOutputStream fileOutputStream = new FileOutputStream("text(2).txt");
 
        int byteCount;
 
        while((byteCount = fileInputStream.read()) != -1) {
            
       // Я отловил в потоке байт который нужно изменить, как его теперь изменить и сохранить?
            if(byteCount == 64 ){
                
            }
            System.out.print(byteCount);
 
        }
    }
}
Может использовать какой то другой способ? Вообще то потом программа должна будет копировать .exe файл с заменой нескольких байтов.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.05.2016, 00:35
Ответы с готовыми решениями:

Функция: изменить старший байт числа на заданное значение, не изменяя младший байт
функция изменяет старший байт числа на заданное значение не изменяя младший байт. как можно проще

Как изменить один байт в бинарном файле?
Здравствуйте. Второй день бьюсь над вопросом, просмотрел много примеров, но не понимаю, помогите. Мне нужно изменить один байт в...

Как изменить контрол в другом потоке WPF
На главном окне находится Canvas в котором находится много Image. Мне нужно поменять Image.Source из другого потока.

5
84
 Аватар для 84
28 / 33 / 12
Регистрация: 11.04.2016
Сообщений: 132
20.05.2016, 08:10
Java
1
2
3
4
5
6
7
        while((byteCount = fileInputStream.read()) != -1) {
  
            if(byteCount == 64 ) fileOutputStream.write(байткоторыймненужен){
                
            }else{ fileOutputStream.write(byteCount)}
 
        }
1
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
20.05.2016, 09:56
Как то так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package ru.cyberforum;
 
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
class Filter {
    private InputStream in;
    private OutputStream out;
    private List<Integer> filter;
    private List<Integer> replace;
 
    Filter(
            InputStream        in, // входной поток
            OutputStream      out, // поток вывода
            List<Integer>  filter, // последовательность для поиска
            List<Integer> replace  // последовательность для замены
    ) {
        if (filter.size() != replace.size())
            throw new IllegalArgumentException("filter.size() != replace.size()");
        this.in = in;
        this.out = out;
        this.filter = filter;
        this.replace = replace;
    }
    /// записывает последовательность list в поток вывода
    private void flush(List<Integer> list) throws IOException {
        byte [] data = new byte[list.size()];
        int id = 0;
        list.forEach(
                item -> { data[id] = item.byteValue(); ++id; }
        );
        out.write(data);
    }
    void process() throws IOException {
        int code; // код символа
        ArrayList<Integer> current; // сохраненная последовательность
        int id; // текущая позиция в фильтре
        current = new ArrayList<>();
        id = 0;
        while (-1 != (code = in.read())) {
            current.add(code); // добавляем в последовательность
            if (filter.get(id) == code) { // считанный код соответствует фильтру
                ++id;
                if (filter.size() == id) { // нашли фильтр полностью
                    current.clear();
                    id = 0;
                    flush(replace); // заменяем
                }
            }
            else { // последовательность оказалась неполной,
                flush(current); // записываем старую
                current.clear();
                id = 0;
            }
        }
    }
}
public class Main {
 
    public static void main(String[] args) {
        try {
            new Filter(
                    new FileInputStream("text.in.txt"),
                    new FileOutputStream("text.out.txt"),
                    Arrays.asList(
                            // какую последовательность искать
                            "@".codePointAt(0),
                            ">".codePointAt(0)),
                    Arrays.asList(
                            // на какую менять
                            ">".codePointAt(0),
                            "@".codePointAt(0))
            ).process();
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }
}
Работу не проверял, но(как минимум) компилируется на OpenJDK-1.8

Добавлено через 35 минут
вот так точно работает на текстовых файлах
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package ru.cyberforum;
 
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
 
class Filter {
    private InputStream in;
    private OutputStream out;
    private List<Integer> filter;
    private List<Integer> replace;
 
    Filter(
            InputStream        in, // входной поток
            OutputStream      out, // поток вывода
            List<Integer>  filter, // последовательность для поиска
            List<Integer> replace  // последовательность для замены
    ) {
        if (filter.size() != replace.size())
            throw new IllegalArgumentException("filter.size() != replace.size()");
        this.in = in;
        this.out = out;
        this.filter = filter;
        this.replace = replace;
    }
    /// записыват последовательность list в поток вывода
    private void flush(List<Integer> list) throws IOException {
        byte [] data = new byte[list.size()];
 
        list.forEach(new Consumer<Integer>() {
            int id = 0;
 
            @Override
            public void accept(Integer item) {
                data[id] = item.byteValue();
                ++id;
            }
        });
        out.write(data);
    }
    void process() throws IOException {
        int code; // код символа
        ArrayList<Integer> current; // сохраненная последовательность
        int id; // текущая позиция в фильтре
        current = new ArrayList<>();
        id = 0;
        while (-1 != (code = in.read())) {
            current.add(code); // добавляем в последовательность
            if (filter.get(id) == code) { // считанный код соответствует фильтру
                ++id;
                if (filter.size() == id) { // нашли фильтр полностью
                    current.clear();
                    id = 0;
                    flush(replace); // заменяем
                }
            }
            else { // последовательность оказалась неполной,
                flush(current); // записываем старую
                current.clear();
                id = 0;
            }
        }
    }
}
class Program {
 
    public static void main(String[] args) {
        try {
            new Filter(
                    new FileInputStream("text.in.txt"),
                    new FileOutputStream("text.out.txt"),
                    Arrays.asList(
                            // какую последовательность искать
                            "@".codePointAt(0),
                            ">".codePointAt(0)),
                    Arrays.asList(
                            // на какую менять
                            ">".codePointAt(0),
                            "@".codePointAt(0))
            ).process();
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }
}
Добавлено через 30 секунд
вот так точно работает на текстовых файлах
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package ru.cyberforum;
 
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
 
class Filter {
    private InputStream in;
    private OutputStream out;
    private List<Integer> filter;
    private List<Integer> replace;
 
    Filter(
            InputStream        in, // входной поток
            OutputStream      out, // поток вывода
            List<Integer>  filter, // последовательность для поиска
            List<Integer> replace  // последовательность для замены
    ) {
        if (filter.size() != replace.size())
            throw new IllegalArgumentException("filter.size() != replace.size()");
        this.in = in;
        this.out = out;
        this.filter = filter;
        this.replace = replace;
    }
    /// записыват последовательность list в поток вывода
    private void flush(List<Integer> list) throws IOException {
        byte [] data = new byte[list.size()];
 
        list.forEach(new Consumer<Integer>() {
            int id = 0;
 
            @Override
            public void accept(Integer item) {
                data[id] = item.byteValue();
                ++id;
            }
        });
        out.write(data);
    }
    void process() throws IOException {
        int code; // код символа
        ArrayList<Integer> current; // сохраненная последовательность
        int id; // текущая позиция в фильтре
        current = new ArrayList<>();
        id = 0;
        while (-1 != (code = in.read())) {
            current.add(code); // добавляем в последовательность
            if (filter.get(id) == code) { // считанный код соответствует фильтру
                ++id;
                if (filter.size() == id) { // нашли фильтр полностью
                    current.clear();
                    id = 0;
                    flush(replace); // заменяем
                }
            }
            else { // последовательность оказалась неполной,
                flush(current); // записываем старую
                current.clear();
                id = 0;
            }
        }
    }
}
class Program {
 
    public static void main(String[] args) {
        try {
            new Filter(
                    new FileInputStream("text.in.txt"),
                    new FileOutputStream("text.out.txt"),
                    Arrays.asList(
                            // какую последовательность искать
                            "@".codePointAt(0),
                            ">".codePointAt(0)),
                    Arrays.asList(
                            // на какую менять
                            ">".codePointAt(0),
                            "@".codePointAt(0))
            ).process();
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }
}
1
 Аватар для olexiy86
32 / 30 / 11
Регистрация: 27.09.2014
Сообщений: 359
20.05.2016, 13:19  [ТС]
84, Cra3y, замечательные варианты, но в моём случа я нашёл более рациональное решение
Java
1
byte[] bytes = Files.readAllBytes(Paths.get("text.txt"));
Потом в массиве делаю всё что душа пожелает, и вывожу обратно в поток.
0
84
 Аватар для 84
28 / 33 / 12
Регистрация: 11.04.2016
Сообщений: 132
20.05.2016, 13:32
olexiy86, В конкретном случае возможно, но знать "на всякий случай" не помешает =)
0
 Аватар для olexiy86
32 / 30 / 11
Регистрация: 27.09.2014
Сообщений: 359
20.05.2016, 13:45  [ТС]
84, Конечно, может быть когда прийдётся перехватывать потоки "на лету" - как раз это и понадобится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.05.2016, 13:45
Помогаю со студенческими работами здесь

Как изменить первые 5 байт в строке типа char
Ламерский вопрос! Есть строка,как изменить в ней первые 5 байт, в них должна храниться длина строки

Перевод указателя на N байт в файловом потоке
Добрый день, помогите пожалуйста. Есть структура: struct Mystruct { char surname; // Фамилия char numberOfTestBook; //...

Как изменить код чтобы он отображал количество прочитанных байт
В книге есть код H = waitbar(0); For i=1:100 S=int2str(i); S=strcat(s,'%'); For j=1:1000000 % ??????? End ...

Как изменить текст на форме из дочернего потока, когда в основном потоке ожидается завершение дочернего
Идея следующая. в основном потоке вызывают метод класса в другом потоке. Причем необходимо: 1. чтобы пока работает дочерний поток...

Как получить значение переменной созданной в потоке, в другом потоке?
Добрый день :) Возник такой вопрос &quot;как получить значение переменной созданной в потоке, в другом потоке?&quot; Не знаю, как правильно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru