использование java.util. Сканер для чтения байта файла байтом

Я пытаюсь считать один символ файла строки символом с помощью java.util. Сканер. Однако я получаю это исключение":

Exception in thread "main" java.util.InputMismatchException: For input string: "contents of my file"
    at java.util.Scanner.nextByte(Scanner.java:1861)
    at java.util.Scanner.nextByte(Scanner.java:1814)
    at p008.main(p008.java:18) <-- line where I do scanner.nextByte()

Вот мой код:

public static void main(String[] args) throws FileNotFoundException {
    File source = new File("file.txt");
    Scanner scanner = new Scanner(source);
    while(scanner.hasNext()) {
        System.out.println((char)scanner.nextByte());
    }
    scanner.close()
}

У кого-либо есть какие-либо идеи относительно того, что я мог бы делать неправильно?

Править: Я понял, что записал hasNext () вместо hasNextByte (). Однако, если я делаю это, это ничего не распечатывает.

5
задан skaffman 8 May 2011 в 09:54
поделиться

3 ответа

Можно написать собственную функцию «pow» для дробей, не использующих возведение в степень с плавающей запятой. Это то, что вы пытаетесь сделать?

Это поднимет дробь до целочисленной степени с падением обратно в плавание.

def pow( fract, exp ):
    if exp == 0: 
        return fract
    elif exp % 2 == 0:
        t = pow( fract, exp//2 )
        return t*t
    else:
        return fract*pos( fract, exp-1 )
-121--4407715-

Отработал.

Оказалось, что я сделал django-admin.py startproject pyTracker , но не python manage.py startapp myApp . Вернувшись и сделав это, это сработало так, как было задокументировано. Кажется, у меня есть много узнать о чтении и разнице между сайтом и приложением в Джанго.

Спасибо за вашу помощь С.Лотт и Эмиль Стенстрём. Хотел бы я принять оба ваших ответа, потому что они оба очень помогают.

Самый важный урок Тесты работают только на уровне приложения, а не на уровне сайта

-121--2047395-

Зачем использовать сканер для чтения байта файла по байтам? Это все равно, что использовать тачку, чтобы перевезти ваш карман. (Если вам действительно нужна тачка для смены кармана, дайте мне знать, чтобы я мог стать вашим другом).

Но серьезно: класс InputStream считывает байты из файла, просто и надежно, и больше ничего не делает.

Сканер класса был недавно введен в Java API, чтобы примеры учебников могли извлекать данные из файла с меньшей болью, чем обычно при использовании каскада new BufferedReader (new InputStream) . Его специализация - ввод цифр и последовательностей из входных файлов произвольной формы. Метод nextByte () фактически считывает одну или несколько десятичных цифр из входного потока (если они есть) и преобразует число, отсканированное таким образом, в одно байтовое значение.

И если вы читаете байты, почему вы хотите вывести их в виде символов ? Байты - это , а не символы, и взаимопреобразование brute-force в некоторых местах завершится неудачей. Если вы хотите видеть значения этих байт, распечатайте их как они есть, и вы увидите небольшие целые числа от 0 до 255.

Если вы хотите прочитать char s из файла, FileReader является для вас классом.

10
ответ дан 18 December 2019 в 13:14
поделиться

При устранении неисправностей сканер , проверьте в основных ошибках ввода / вывода :

if(scanner.ioException() != null) {
  throw scanner.ioException();
}

Хотя я с другими - это, вероятно, не правильный класс для работы. Если вы хотите введите байт, используйте вход (в этом случае FileInputStream ). Если вы хотите введите CHAR, используйте устройство (например, inputstreamreader ).

1
ответ дан 18 December 2019 в 13:14
поделиться

В 3,0 и выше можно получить продолжительность анимации и кривую из словаря userInfo уведомлений.

Например, чтобы анимировать размер представления, чтобы освободить место для клавиатуры, зарегистрируйтесь для UIKeyâWillStartNotification и выполните следующее:

- (void)keyboardWillShow:(NSNotification *)notification
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
    [UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];

    CGRect frame = self.view.frame;
    frame.size.height -= [[[notification userInfo] objectForKey:UIKeyboardBoundsUserInfoKey] CGRectValue].size.height;
    self.view.frame = frame;

    [UIView commitAnimations];
}

Выполните аналогичную анимацию для UIKeyâWillheyNotification .

-121--755177-

Выполняется сортировка массива последовательностей с помощью StringVector. Чтобы минимизировать накладные расходы, можно отсортировать массив последовательностей.

package main

import (
    "fmt"
    "sort"
)

func main() {
    m := map[string]string{"b": "15", "z": "123123", "x": "sdf", "a": "12"}
    mk := make([]string, len(m))
    i := 0
    for k, _ := range m {
        mk[i] = k
        i++
    }
    sort.Strings(mk)
    fmt.Println(mk)
}

Output:

[a b x z]
-121--1193535-

Scanner предназначен для синтаксического анализа текстовых данных - метод nextByte () ожидает, что входные данные будут состоять из цифр (возможно, перед которыми будет стоять знак).

Возможно, вы хотите использовать FileReader , если вы действительно читаете текстовые данные, или FileInputStream , если это двоичные данные. Или FileInputStream , заключенный в InputStreamReader , если вы читаете текст с определенной кодировкой символов (к сожалению, FileReader не позволяет указать кодировку, но использует кодировку платформы по умолчанию неявно, что часто нехорошо).

2
ответ дан 18 December 2019 в 13:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: