powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Прочитать часть файла
8 сообщений из 8, страница 1 из 1
Прочитать часть файла
    #38811927
VaneS Ri_lax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, у меня есть файл с расширением .DAT
В нем n-е количество строк, подскажите пожалуйста как скопировать с него, к примеру, с 10 по 20 строку?
Проблема в том что файл не совсем текстовый, нужно эти строки как то скопировать по байтно, можно ли как то это сделать? Заранее большое спасибо!
...
Рейтинг: 0 / 0
Прочитать часть файла
    #38811933
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VaneS Ri_lax,

Берем FileInputStream. Заворачиваем в BufferedInputStream. Читаем посимвольно. После переноса N-ого строки прекращаем чтение.
...
Рейтинг: 0 / 0
Прочитать часть файла
    #38811970
VaneS Ri_lax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дело в том что я не знаю с какой строки мне нужно начать чтение этого файла, я делаю так:
Код: 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.
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import org.apache.commons.io.FileUtils;


public class Main {
    public static void main(String args[]) throws IOException{
     
        
        File file = new File("cache");
        if(false == file.exists()){ // если нет такой папки, создает ее
            file.mkdir();
        }
       
        File zap;
        
        ArrayList<String> fileLine = new ArrayList<String>();
        
        ArrayList<String> dataLine = new ArrayList<String>();
        
        
        File data = new File("MSG.DAT");
        fileLine = (ArrayList<String>) FileUtils.readLines(data); // чтение всего файла
        
        System.out.println("Всего строк: " + fileLine.size());
        for(int i=0; i<fileLine.size(); i++){ // перебор всех строк
            if(fileLine.get(i).contains("R41-5000")){ // если в строке найдена подстрока то делать следующее
                String fname = "";
                fileLine.set(i, fileLine.get(i).substring(fileLine.get(i).indexOf('R'))); // обрезает строку чтобы подстрака "R41-5000" была началом строки
                fname = fileLine.get(i).substring(0, fileLine.get(i).indexOf('.')+4); // читает каким должно быть имя файла (это подстрока и 3 символа после точки)
                for(int x=i; x<=(i+33); x++) копирует начиная с этой строки (которая включает в себя подстроку "R41-5000") еще 33 строки
                {
                    dataLine.add(fileLine.get(x));
                }
                zap = new File("cache/"+fname);
                FileUtils.writeLines(zap, dataLine, "ANSI"); // пишет эти 33 строки в файл
                dataLine.clear();
               }
        }
            
        
        
    }
}



Это все работает, пишет файлы вроде правильно, но там они получаются почему то в одну строку и уже просто символы, а мне нужны именно они как байты.
...
Рейтинг: 0 / 0
Прочитать часть файла
    #38811978
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VaneS Ri_lax,

Вы заявили что файл не текстовый, а потом работаете с ним как с текстом. "Удачный подход".
...
Рейтинг: 0 / 0
Прочитать часть файла
    #38811985
VaneS Ri_lax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я просто не совсем силен в Java? по этому и обратился сюда.
Но мне важно еще как то в определять части большого файла, как это можно реализовать?
А можно ли как то с помощью библиотеки commons-io-2.4.jar (Я использую ее в качестве чтения файла) считать файл по байтно?
...
Рейтинг: 0 / 0
Прочитать часть файла
    #38812035
mr_virtus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VaneS Ri_lax,

VaneS Ri_lax,

а чем вам предложенный выше вариант не подходит?

авторЧитаем посимвольно. После переноса N-ого строки прекращаем чтение.

тот же inputstream, например

http://tutorials.jenkov.com/java-io/inputstream.html
...
Рейтинг: 0 / 0
Прочитать часть файла
    #38812498
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
побайтно короче, а не посимвольно.
Для чтения необходимо и достаточно использовать только int InputStream.read()
...
Рейтинг: 0 / 0
Прочитать часть файла
    #38812577
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VaneS Ri_laxв одну строку и уже просто символы, а мне нужны именно они как байты.

Без побайтового чтения, но работать будет лучше:
Код: 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.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Writer;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Iterator;
import java.util.stream.Stream;

import static java.nio.charset.StandardCharsets.ISO_8859_1;
import static java.nio.file.Files.createDirectories;
import static java.nio.file.Files.exists;
import static java.nio.file.Files.newBufferedReader;
import static java.nio.file.Files.newBufferedWriter;

public class Main {

    private static final String DELIMETER_TO_START_FROM = "R41-5000";
    private static final int COUNT_LINES_TO_WRITE_AFTER_R41 = 32;

    public static void main(String[] args) throws IOException {
        Path
                dirCache = Paths.get("cache"),
                fileSrc  = Paths.get("MSG.DAT");

        if (!exists(dirCache)) {
            createDirectories(dirCache);
        }

        try (BufferedReader bufferedReader = newBufferedReader(fileSrc, ISO_8859_1)) {
            Iterable<String> lines = asIterable(bufferedReader.lines());

            //<editor-fold defaultstate="collapsed" desc="search for firstLine">
            String firstLine = null;
            for (String line : lines) {
                int indexOfR41 = line.indexOf(DELIMETER_TO_START_FROM);
                if (indexOfR41 != -1) {
                    firstLine = line.substring(indexOfR41);
                    break;
                }
            }
            //</editor-fold>

            if (firstLine != null) {
                Path fileOut = dirCache.resolve(
                        firstLine.substring(0, firstLine.indexOf('.') + 4)
                );

                try (Writer writer = newBufferedWriter(fileOut, ISO_8859_1)) {
                    writer.write(firstLine);
                    //<editor-fold defaultstate="collapsed" desc="оставшиеся 32 строки">
                    int cntLinesWritedAfterR41 = 0;
                    for (String line : lines) {
                        writer.write("\n"); //в исходном файле могут быть несколько разделителей или только \r, -> возможно искажение
                        writer.write(line);
                        if (++cntLinesWritedAfterR41 >= COUNT_LINES_TO_WRITE_AFTER_R41) {
                            break;
                        }
                    }
                    //</editor-fold>
                }
            }
        }
    }

    /** !Инстанс Iterable при каждом вызове метода iterator() будет возвращать один и тотже итератор. */
    public static <T> Iterable<T> asIterable(Stream<T> stream) {
        Iterator<T> iterator = stream.iterator();
        return () -> iterator;
    }
}
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Прочитать часть файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]