Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

Scanner
Список форумов
 ->  Файлы и потоки ввода/вывода


 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
Ёрик : 187
Новичок
Откуда: Кисловодск

СообщениеЯнв 28, 2012 14:14 
Ответить с цитатой
Здравствуйте.Мне нужно сделать форматированное чтение из файла.
Формат данных такой:
string string 56 56
string 5 5
string 5 7
string 6 8
string 7 6
string 8 5

ПЫтался сделать это с помощью Scanner - не получилось. Почему-то выбрасывается исключение MismatchException.
Первую строку прочитал успешно:
Сделал skip("str str"), затем nextInt 2 раза. Данные находил (2 int'а).
Затем делал skip("str") и nextInt() выпоняли, доставал первое целочисленное число. А затем выбрасывал исключение. Причем провериял функцией next(), которая возвращает строку. У бедился, что следущий тип - int., но почему-то выбрасывал исключение при вызове nextInt().
Потом вообще каждый раз вызывал next(), чтобы пропустить строку. Но т.к. файл большой (17 мб), хотя структура большая, выскакивало исключение IOException при чтении (13% файла прочитывал и выбрасывал его).

На С проблем нет. Файл считывается успешно, причем там 2 строки sscanf("%s %s %d %d")
цикл
sscanf("%s %d %d")


Как мне прочитать файл с такой структурой? Причем так так, чтобы файл любого размера считывался.
К началу Посмотреть профиль Отправить личное сообщение
Vantuz-Subhuman : 660
Постоянный посетитель
Откуда: издиснейленда

СообщениеЯнв 28, 2012 14:51 
Ответить с цитатой
Ёрик писал(а):
Здравствуйте.Мне нужно сделать форматированное чтение из файла.
Формат данных такой:
string string 56 56
string 5 5
string 5 7
string 6 8
string 7 6
string 8 5

ПЫтался сделать это с помощью Scanner - не получилось. Почему-то выбрасывается исключение MismatchException.
Первую строку прочитал успешно:
Сделал skip("str str"), затем nextInt 2 раза. Данные находил (2 int'а).
Затем делал skip("str") и nextInt() выпоняли, доставал первое целочисленное число. А затем выбрасывал исключение. Причем провериял функцией next(), которая возвращает строку. У бедился, что следущий тип - int., но почему-то выбрасывал исключение при вызове nextInt().
Потом вообще каждый раз вызывал next(), чтобы пропустить строку. Но т.к. файл большой (17 мб), хотя структура большая, выскакивало исключение IOException при чтении (13% файла прочитывал и выбрасывал его).

На С проблем нет. Файл считывается успешно, причем там 2 строки sscanf("%s %s %d %d")
цикл
sscanf("%s %d %d")


Как мне прочитать файл с такой структурой? Причем так так, чтобы файл любого размера считывался.


Попробуйте делать не "skip("str str"), затем nextInt 2 раза", а 2 раза next(), 2 раза nextInt(). Так у меня всё работает:

Содержимое файла "file":
Цитата:
str trs 15 25
qwe 813 334
qazxs 898 214
ewrqerq 515 161
rdfv 899 120
dcvf 46 376
yghfgrt 832 4


Код:
public static void main(String[] args) {

   FileInputStream fis = null;
   InputStreamReader isr = null;
   BufferedReader br = null;
   try {
      
      fis = new FileInputStream("file");
      isr = new InputStreamReader(fis, "utf8");
      br = new BufferedReader(isr);

      Scanner sc = new Scanner(br);
      System.out.println("line 1.1 :: " + sc.next());
      System.out.println("line 1.2 :: " + sc.next());
      System.out.println("num  1.3 :: " + sc.nextInt());
      System.out.println("num  1.4 :: " + sc.nextInt());
      
      for (int i = 1; sc.hasNext(); i++) {
         
         System.out.println();
         System.out.println("\t" + i + " :: line :: " + sc.next());
         System.out.println("\t" + i + " :: num1 :: " + sc.nextInt());
         System.out.println("\t" + i + " :: num2 :: " + sc.nextInt());
      }
      
   } catch (IOException e) {
      
      System.out.println("Error: " + e);
      
   } finally {

      close(br);
      close(isr);
      close(fis);
   }
}

private static void close(Closeable c) {
   
   try {
      if (c != null) c.close();
   } catch (Exception e) {}
}


Вывод:
Код:
line 1.1 :: str
line 1.2 :: trs
num  1.3 :: 15
num  1.4 :: 25

   1 :: line :: qwe
   1 :: num1 :: 813
   1 :: num2 :: 334

   2 :: line :: qazxs
   2 :: num1 :: 898
   2 :: num2 :: 214

   3 :: line :: ewrqerq
   3 :: num1 :: 515
   3 :: num2 :: 161

   4 :: line :: rdfv
   4 :: num1 :: 899
   4 :: num2 :: 120

   5 :: line :: dcvf
   5 :: num1 :: 46
   5 :: num2 :: 376

   6 :: line :: yghfgrt
   6 :: num1 :: 832
   6 :: num2 :: 4

_________________
«One should never underestimate the predictability of stupidity»,
«Never attribute to malice that which can be adequately explained by stupidity»
К началу Посмотреть профиль Отправить личное сообщение
Ёрик : 187
Новичок
Откуда: Кисловодск

СообщениеЯнв 29, 2012 13:49 
Ответить с цитатой
Я так уже делал, и уменя заработало, только файл большой не мог прочитать:

Цитата:
Потом вообще каждый раз вызывал next(), чтобы пропустить строку. Но т.к. файл большой (17 мб), хотя структура большая, выскакивало исключение IOException при чтении (13% файла прочитывал и выбрасывал его).


Ваш код файл какого размера читает?
К началу Посмотреть профиль Отправить личное сообщение
Vantuz-Subhuman : 660
Постоянный посетитель
Откуда: издиснейленда

СообщениеЯнв 29, 2012 14:16 
Ответить с цитатой
Ёрик писал(а):
Я так уже делал, и уменя заработало, только файл большой не мог прочитать:

Цитата:
Потом вообще каждый раз вызывал next(), чтобы пропустить строку. Но т.к. файл большой (17 мб), хотя структура большая, выскакивало исключение IOException при чтении (13% файла прочитывал и выбрасывал его).


Ваш код файл какого размера читает?


Вы какими ридерами пользовались?

Т.к. вот этот код сгенерил файл размером ~34 МБ, а потом нормально его прочитал:

Код:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.Closeable;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class Test {

   public static void main(String[] args) {

      try {
         
         BufferedWriter bw = new BufferedWriter(new FileWriter("file"));
         bw.write("strse trsqa 589 6521");
         for (int i = 0; i < 2000000; i++) {

            bw.newLine();
            bw.write(randomString((i & 10) + 2) + " ");
            bw.write((int)(Math.random() * 2000) + " ");
            bw.write((int)(Math.random() * 2000) + "");
         }
         bw.close();
         
      } catch (IOException e1) {
         
         e1.printStackTrace();
      }

      FileInputStream fis = null;
      InputStreamReader isr = null;
      BufferedReader br = null;
      try {
         
         fis = new FileInputStream("file");
         isr = new InputStreamReader(fis, "utf8");
         br = new BufferedReader(isr);

         int lines = 0;
         int nums = 0;
         
         Scanner sc = new Scanner(br);
         sc.next();
         sc.next();
         lines += 2;
         
         sc.nextInt();
         sc.nextInt();
         nums += 2;
         
         for (int i = 1; sc.hasNext(); i++) {
            
            System.out.println(i + ": " + sc.next());
            lines++;
            
            sc.nextInt();
            sc.nextInt();
            nums += 2;
         }
         
         System.out.println("lines: " + lines);
         System.out.println("nums: " + nums);
         
      } catch (IOException e) {
         
         System.out.println("Error: " + e);
         
      } finally {

         close(br);
         close(isr);
         close(fis);
      }
   }

   private static String randomString(int len) {
      
      StringBuilder sb = new StringBuilder();
      for (int i = 0; i < len; i++) {
         
         sb.append((char) (Math.random() * ('z' - 'a') + 'a'));
      }
      return sb.toString();
   }
   
   private static void close(Closeable c) {
      
      try {
         if (c != null) c.close();
      } catch (Exception e) {}
   }
}


Последние строки вывода:
1999995: ppiqpacyjtxq
1999996: hyvxqdprhrny
1999997: ppeiceyyto
1999998: nvvvrjuwxm
1999999: trxdqajdvkss
2000000: dkqnvymyaeux
lines: 2000002
nums: 4000002
_________________
«One should never underestimate the predictability of stupidity»,
«Never attribute to malice that which can be adequately explained by stupidity»
К началу Посмотреть профиль Отправить личное сообщение
Ёрик : 187
Новичок
Откуда: Кисловодск

СообщениеЯнв 29, 2012 15:08 
Ответить с цитатой
Спасибо, разобрался. Из-за копипаста было много повторных строчек, в одной из них я убрал цифру случайно. Еле нашел в ошибку в файле.
К началу Посмотреть профиль Отправить личное сообщение
Vantuz-Subhuman : 660
Постоянный посетитель
Откуда: издиснейленда

СообщениеЯнв 29, 2012 15:30 
Ответить с цитатой
Ёрик писал(а):
Спасибо, разобрался. Из-за копипаста было много повторных строчек, в одной из них я убрал цифру случайно. Еле нашел в ошибку в файле.


А вот поэтому, при таком объёме данных, лучше самому читать файл построчно и сканировать (или парсить руками) уже их. Чтобы всегда можно было вывести на экран или ещё куда угодно последние обработанные перед ошибкой данные.
_________________
«One should never underestimate the predictability of stupidity»,
«Never attribute to malice that which can be adequately explained by stupidity»
К началу Посмотреть профиль Отправить личное сообщение
 
Начать новую тему  Ответить на тему
Страница 1 из 1
Список форумов
 -> Файлы и потоки ввода/вывода


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru