Что такое типы raw в Java и почему я часто слышу, что они не должны использоваться в новом коде?
Необработанные типы - это древняя история Java язык. В начале были
Collections
, и они больше не держалиObjects
и ничего меньше. Каждая операция наCollections
требовала отличных отObject
желаемого типа.List aList = new ArrayList(); String s = "Hello World!"; aList.add(s); String c = (String)aList.get(0);
Хотя это продолжалось большую часть времени, произошли ошибки
List aNumberList = new ArrayList(); String one = "1";//Number one aNumberList.add(one); Integer iOne = (Integer)aNumberList.get(0);//Insert ClassCastException here
Старый нетривиальные коллекции не могли обеспечить безопасность типов, поэтому программисту приходилось запоминать то, что он хранил в коллекции. Генераторы, изобретенные, чтобы обойти это ограничение, разработчик объявит сохраненный тип один раз, и компилятор сделает это вместо этого.
List
aNumberList = new ArrayList (); aNumberList.add("one"); Integer iOne = aNumberList.get(0);//Compile time error String sOne = aNumberList.get(0);//works fine Для сравнения:
// Old style collections now known as raw types List aList = new ArrayList(); //Could contain anything // New style collections with Generics List
aList = new ArrayList (); //Contains only Strings Более сложный Интерфейс Compareable:
//raw, not type save can compare with Other classes class MyCompareAble implements CompareAble { int id; public int compareTo(Object other) {return this.id - ((MyCompareAble)other).id;} } //Generic class MyCompareAble implements CompareAble
{ int id; public int compareTo(MyCompareAble other) {return this.id - other.id;} } Обратите внимание, что невозможно реализовать интерфейс
CompareAble
сcompareTo(MyCompareAble)
с необработанными типами. Почему вы не должны их использовать:
- Любое
Object
, хранящееся вCollection
, должно быть выполнено до его использования- Использование обобщений позволяет проверять время компиляции
- Использование исходных типов - это то же самое, что и сохранение каждого значения как
Object
Что делает компилятор: Дженерики обратно совместимы, они используют одни и те же классы java, типы делают.
List
someStrings = new ArrayList (); someStrings.add("one"); String one = someStrings.get(0); Будет скомпилирован как:
List someStrings = new ArrayList(); someStrings.add("one"); String one = (String)someStrings.get(0);
Это тот же код, который вы бы написали, если вы использовали исходные типы напрямую. Думаю, я не уверен, что происходит с интерфейсом
CompareAble
, я предполагаю, что он создает две функцииcompareTo
, одна из которых принимаетMyCompareAble
, а другая принимаетObject
и передает ее первой после ее литья.Каковы альтернативы сырым типам: используйте generics
FileStorage
содержит поле stream
. Этот объект должен расширять IO или файл-объект, поэтому он должен содержать read
и другие подобные методы. FileStorage
также расширяют атрибуты объекта поля stream
, поэтому вы можете просто использовать file.read()
вместо file.stream.read()
. Также вы можете использовать аргумент save
с параметром dst
как StringIO
или другой объект ввода-вывода или файл, чтобы скопировать FileStorage.stream
в другой объект ввода-вывода или файл.
См. Документацию: http: //flask.pocoo.org/docs/api/#flask.Request.files и http://werkzeug.pocoo.org/docs/datastructures/#werkzeug.datastructures.FileStorage .
Если вы хотите использовать стандартные флеш-файлы - нет способа избежать сохранения временного файла, если размер загруженного файла составляет> 500 кб. Если он меньше 500 КБ, он будет использовать «BytesIO», который хранит содержимое файла в памяти, а если он больше 500 КБ - он хранит содержимое в TemporaryFile () (как указано в документации werkzeug ). В обоих случаях ваш скрипт будет блокироваться до тех пор, пока не будет получен весь загруженный файл.
Самый простой способ обойти это, что я нашел:
1) Создайте свой собственный файл- как класс IO, где вы выполняете всю обработку входящих данных
2) В вашем скрипте переопределите класс Request своим:
class MyRequest( Request ):
def _get_file_stream( self, total_content_length, content_type, filename=None, content_length=None ):
return MyAwesomeIO( filename, 'w' )
3) Замените запрос_класса Flask вашим собственный:
app.request_class = MyRequest
4) Идите, выпейте пиво:)
file = request.files.get('file')
filetype = magic.from_buffer(file.read(1024))
– endolith 26 December 2014 в 21:00f = request.files['file']
помещает загруженный файл (в запрос) в var (& quot; f & quot;). Затемf.read()
работает с использованием вышеуказанного кода. когдаprint f.read()
я получаю правильный мусор в терминале. Надеюсь, это поможет. – Marc 11 February 2015 в 18:56mystring = TextIOWrapper(binary_stream)
– Dutch Masters 14 July 2016 в 14:57