Невозможно сделать это напрямую. Меньшие единицы компьютеров могут обрабатывать байты (даже булевы занимают байты). Однако вы можете создать собственный класс потока, который упаковывает байт с нужными битами, а затем записывает его. Затем вы можете создать оболочку для этого класса, у которого функция записи принимает некоторый интегральный тип, проверяет, что она находится между 0 и 7 (или -4 и 3 ... или что-то еще), извлекает биты так же, как и класс BitInputStream (ниже) делает и выполняет соответствующие вызовы метода записи BitOutputStream. Возможно, вы думаете, что можете просто создать один набор классов потока ввода-вывода, но 3 не равномерно распределяется по 8. Поэтому, если вам нужна оптимальная эффективность хранения, и вы не хотите работать очень сильно, вы застряли с двумя уровнями абстракции. Ниже приведен класс BitOutputStream, соответствующий класс BitInputStream и программа, которая гарантирует их работу.
import java.io.IOException;
import java.io.OutputStream;
class BitOutputStream {
private OutputStream out;
private boolean[] buffer = new boolean[8];
private int count = 0;
public BitOutputStream(OutputStream out) {
this.out = out;
}
public void write(boolean x) throws IOException {
this.count++;
this.buffer[8-this.count] = x;
if (this.count == 8){
int num = 0;
for (int index = 0; index < 8; index++){
num = 2*num + (this.buffer[index] ? 1 : 0);
}
this.out.write(num - 128);
this.count = 0;
}
}
public void close() throws IOException {
int num = 0;
for (int index = 0; index < 8; index++){
num = 2*num + (this.buffer[index] ? 1 : 0);
}
this.out.write(num - 128);
this.out.close();
}
}
Я уверен, что есть способ упаковать int с битовыми операторами и, таким образом, избежать для изменения ввода, но я не думаю, что это трудно.
Кроме того, вы, вероятно, заметили, что нет локального способа обнаружить, что последний бит был прочитан в этой реализации, но я really не хотят думать , что hard.
import java.io.IOException;
import java.io.InputStream;
class BitInputStream {
private InputStream in;
private int num = 0;
private int count = 8;
public BitInputStream(InputStream in) {
this.in = in;
}
public boolean read() throws IOException {
if (this.count == 8){
this.num = this.in.read() + 128;
this.count = 0;
}
boolean x = (num%2 == 1);
num /= 2;
this.count++;
return x;
}
public void close() throws IOException {
this.in.close();
}
}
Возможно, вы это знаете, но вы должны поместить BufferedStream между вашим BitStream и FileStream или это займет много времени.
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
class Test {
private static final int n = 1000000;
public static void main(String[] args) throws IOException {
Random random = new Random();
//Generate array
long startTime = System.nanoTime();
boolean[] outputArray = new boolean[n];
for (int index = 0; index < n; index++){
outputArray[index] = random.nextBoolean();
}
System.out.println("Array generated in " + (double)(System.nanoTime() - startTime)/1000/1000/1000 + " seconds.");
//Write to file
startTime = System.nanoTime();
BitOutputStream fout = new BitOutputStream(new BufferedOutputStream(new FileOutputStream("booleans.bin")));
for (int index = 0; index < n; index++){
fout.write(outputArray[index]);
}
fout.close();
System.out.println("Array written to file in " + (double)(System.nanoTime() - startTime)/1000/1000/1000 + " seconds.");
//Read from file
startTime = System.nanoTime();
BitInputStream fin = new BitInputStream(new BufferedInputStream(new FileInputStream("booleans.bin")));
boolean[] inputArray = new boolean[n];
for (int index = 0; index < n; index++){
inputArray[index] = fin.read();
}
fin.close();
System.out.println("Array read from file in " + (double)(System.nanoTime() - startTime)/1000/1000/1000 + " seconds.");
//Delete file
new File("booleans.bin").delete();
//Check equality
boolean equal = true;
for (int index = 0; index < n; index++){
if (outputArray[index] != inputArray[index]){
equal = false;
break;
}
}
System.out.println("Input " + (equal ? "equals " : "doesn't equal ") + "output.");
}
}
Просто проверьте ваш composer.json. Я только что сделал то же самое, и только воспитывал несовершеннолетнего. Затем я запустил обновление композитора, и мне это удалось.
Я всегда следую инструкциям.
https://symfony.com/doc/current/setup/upgrade_minor.html https://github.com/symfony/symfony/blob/4.2/UPGRADE- 4.2.md
В моем случае я обновлялся до 4.2 с 4.1.11 и некоторые новые файлы с 4.2 по какой-то причине не создавались автоматически. Кроме того, есть несколько изменений в файлах среды, которые я считаю очень важными.
Я думаю, что лучший и самый чистый способ сделать это - сделать следующее:
Инструкции
composer.json
"extra": {
"symfony": {
"allow-contrib": false,
"require": "4.2.*"
}
}
composer update "symfony/*"
config/bootstrap.php
с этим кодом . public/index.php
с помощью этого кода . .gitignore
Удалить
###> symfony/framework-bundle ###
/.env
Добавить
###> symfony/framework-bundle ###
/.env.local
/.env.local.php
/.env.*.local
.env
в .env.local
.env.dist
в .env
Тестирование с помощью PHPUnit
Выполните следующие дополнительные шаги, если вы используете PHPUnit в своем приложении ( Рекомендуется ):
.env.test
и установите переменные для тестовой среды. . [тысяча сто двадцать восемь] phpunit.xml.dist
с помощью этого кода . Важно
Вы должны уведомить об изменениях файлов среды в вашей команде, и они должны сделать резервную копию своей текущей конфигурации, прежде чем извлекать изменения, потому что это будет переопределить файл .env
.
Если вам нужна дополнительная информация об этом решении, прочитайте: https://symfony.com/doc/current/configuration/dot-env-changes.html