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

Берем FileInputStream. Заворачиваем в BufferedInputStream. Читаем посимвольно. После переноса N-ого строки прекращаем чтение.
...
Рейтинг: 0 / 0
20.11.2014, 14:38
    #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
20.11.2014, 14:41
    #38811978
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать часть файла
VaneS Ri_lax,

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

VaneS Ri_lax,

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

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

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

http://tutorials.jenkov.com/java-io/inputstream.html
...
Рейтинг: 0 / 0
20.11.2014, 21:27
    #38812498
scf
scf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Прочитать часть файла
побайтно короче, а не посимвольно.
Для чтения необходимо и достаточно использовать только int InputStream.read()
...
Рейтинг: 0 / 0
21.11.2014, 00:04
    #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
Форумы / Java [игнор отключен] [закрыт для гостей] / Прочитать часть файла / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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